Vous semblez poser beaucoup de ces questions. Je suggère de vous familiariser avec l'expression régulière pour mieux comprendre les réponses et proposer vos propres solutions. Regular-Expressions.info est un bon point de départ.
Pour écrire une expression régulière correspondant aux lignes contenant votre cas (c.-à-d. AT après PIPE), vous devez utiliser
^.*?\|.*?@
Ici ^
signifie le début de la ligne, .*?
correspond à tous les caractères, mais le moins possible @
est un @ littéral, et \|
un littéral |, juste échappé car il a une signification particulière dans les expressions régulières.
Pour supprimer le signe AT, vous demandez à sed de remplacer la phrase entière par tout sauf le signe AT. Pour ce faire, vous devez stocker tout ce que vous souhaitez conserver. Les expressions régulières gèrent cela avec des groupes de capture. Vous arrivez à
^(.*?\|.*?)@
La commande sed que vous recherchez ressemble enfin à
sed -r 's/^(.*?|.*?)@/\1/'
La commande "s" signifie substitut, l'expression régulière que nous avons créée se situe entre la première paire de /
(avec les crochets et la barre oblique inversée échappés). Le texte pour remplacer la correspondance est \1
derrière et représente le contenu du premier groupe de capture. Puisque nous n'avons pas capturé l'AT, cela devrait faire l'affaire.
J'espère avoir aidé. Puisque je n'ai pas de sed ici, cela peut ne pas fonctionner sans modifications. =)
sed 's/^\(.*\?\|.*\?\)@/\1/'
oused -r 's/^(.*?|.*?)@/\1/'
(corrections à l'échappement)Désolé, je ne peux pas commenter actuellement la solution de Jens.
Les modèles abordés dans la solution de Jens ne répondent pas à l'exigence de 'supprimer le caractère @ uniquement ... après le premier "|" personnage'. Un motif conforme serait:
Ceci ne modifie pas les lignes qui ont un PIPE supplémentaire avant la séquence PIPE AT.
la source