% echo "ABCDE 123 |@ TEST" | sed 's,|@,|,'
é essencialmente o mesmo que a sua outra pergunta.
Como excluir um único caractere após outro caractere na fila por sed
Por exemplo
LINE="ABCDE 123 |@ TEST"
Eu quero excluir o caractere @ somente se ele existir após o primeiro "|" personagem em linha
O comando sed irá verificar se: @ o caracter existe após "|" , e se for verdade, o sed excluirá o caractere @
outro exemplo
LINE="qwe 123 >|@ sdf g" (before sed action)
LINE=="qwe 123 >| sdf g" (after sed action)
THX
Você parece fazer muitas dessas perguntas. Sugiro que você se familiarize com a expressão regular para entender melhor as respostas e apresentar suas próprias soluções. Regular-Expressions.info é um bom ponto de partida.
Para escrever uma expressão regular que corresponda a linhas que contenham o seu caso (por exemplo, AT após o PIPE), você usaria
^.*?\|.*?@
Aqui ^
significa o início da linha, .*?
corresponde a qualquer caractere, mas o mínimo possível, @
é literal @, e \|
é literal |, apenas escapou porque tem especial significado em expressões regulares.
Para excluir o sinal AT, você instrui o sed para substituir a sentença inteira por tudo, menos o sinal AT. Para fazer isso, você precisa armazenar tudo o que deseja manter. Expressões regulares gerenciam isso com a captura de grupos. Você chega a
^(.*?\|.*?)@
O comando sed que você está procurando finalmente parece
sed -r 's/^(.*?|.*?)@//'
O comando "s" representa substituto, a expressão regular que criamos está entre o primeiro par de /
(com os colchetes e a barra invertida sendo escapados). O texto para substituir a correspondência é o por trás e representa o conteúdo do primeiro grupo de captura. Como não capturamos o AT, isso deve ser feito.
Espero ter ajudado. Como não tenho sed aqui, isso pode ou não funcionar sem modificações. =)
Desculpe, não posso comentar sobre a solução da Jens.
Os padrões discutidos na solução de Jens não atendem ao requisito de "excluir o caractere @ somente ... após o primeiro" | " personagem'. Um padrão de conformidade seria:
sed 's/\(^[^|]|\)@//'
Isto não modifica as linhas que possuem um PIPE adicional antes da sequência PIPE AT.
Tags sed