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?

user80538
fonte
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
drs
fonte
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-
Joseph R.
fonte
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.


fonte
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.