Como excluir texto antes de um delimitador no Linux


16

Eu preciso excluir o texto de uma linha antes do delimitador.

Por exemplo:

(123434): hello::{apple,orange,mango}.

Eu preciso excluir o texto antes da primeira :. ie (123434).

Existe algum comando no linux para executar esta tarefa?


Você pode querer investigar sedouawk
Paul

Este texto faz parte de um arquivo ou parte de uma variável bash?
Bernhard

Faz parte do arquivo.
user80538

Respostas:


14

Este sedcomando deve fazer o truque. O seguinte comando substituirá o arquivo:

sed -i 's/^[^:]*:/:/' file

Para imprimir apenas a saída, remova a -ibandeira. Para colocar a saída em um novo arquivo, remova o -isinalizador e redirecione a saída:

sed 's/^[^:]*:/:/' file > new_file

A linha fez a mágica ... a saída substituído no próprio arquivo ..
user80538

Quando eu comparo dois arquivos usando o sdiff, depois de remover o texto dos dois arquivos, a diferença mostra o texto removido para mim. este comando sobrescreve o arquivo ou apenas mostra a saída.
user80538

Funcionou .. Posso extrair 'olá' e {maçã, laranja, manga} do meu exemplo, fazendo alterações simples no comando acima?
user80538

@ user80538, é difícil dizer o que você deseja quando diz extrair nesse contexto. Isso faz parte de um script de shell maior? Você pode fazer uma nova pergunta com os detalhes do problema maior que você está tentando resolver.
quer

É apenas uma comparação simples de dois arquivos com os mesmos dados, mas só é necessário descobrir onde os dados diferem em dois arquivos. Eu preciso verificar cada seção individual na linha. Os dados em seções individuais podem se confundir. como {maçã, laranja, manga} pode ser {maçã, manga, laranja}.
user80538

14

Você pode usar cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Você pode fazer isso com uma instrução Bash bastante simples :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Isso será impresso : hello::{apple,orange,mango}.. Você pode cortar prefixos e sufixos de maneira semelhante. Além disso, as definições de prefixo e sufixo podem conter caracteres curinga.

Recortar prefixo - até a primeira correspondência curinga de prefixo: ${variable#prefix}

Recortar prefixo - até a última correspondência de curinga do prefixo: ${variable##prefix}

Recortar sufixo - até a primeira correspondência de curinga do sufixo: ${variable%suffix}

Recortar sufixo - até a última correspondência de curinga do sufixo: ${variable%%suffix}

Pode parecer pouco claro à primeira vista, veja o seguinte exemplo:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

No último exemplo, o padrão não corresponde, então nada é cortado.


Seria mais robusto de usar echo ${mytext#*:}:. Isso manipulará corretamente linhas como (123)(434): hello::{apple,orange,mango}.e 123434: hello::{apple,orange,mango}.
quer

Existe alguma maneira de modificar o comando echo $ {mytext %% B *} para obter texto depois de B. no seu exemplo
user80538

@ user80538 sim, basta cortar o texto antes de B, inclusive ;-), ou seja: $ {mytext # * B} para o texto após o primeiro B e $ {mytext ## * B} para o texto após o segundo B.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.