sed + Como excluir um único caractere após outro caractere na fila por sed

0

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

    
por yael 28.06.2010 / 11:23

3 respostas

1
 % echo "ABCDE 123 |@ TEST" | sed 's,|@,|,'

é essencialmente o mesmo que a sua outra pergunta.

    
por 28.06.2010 / 11:57
0

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. =)

    
por 28.06.2010 / 11:53
0

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.

    
por 28.06.2010 / 17:01

Tags