sed + Comment supprimer un caractère après l'autre en ligne par sed

0

Comment effacer un caractère après l'autre en ligne par sed

Par exemple

   LINE="ABCDE 123 |@ TEST"

Je veux supprimer le caractère @ uniquement s'il existe après le premier "|" caractère en LIGNE

La commande sed vérifiera si: le caractère @ existe après "|" et si sa valeur est true, sed supprimera le caractère @

autre exemple

    LINE="qwe 123 >|@ sdf g"  (before sed action)

    LINE=="qwe 123 >| sdf g"  (after sed action)

THX

yael
la source

Réponses:

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

c'est essentiellement la même chose que votre autre question.

Akira
la source
0

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 \1derriè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. =)

Jens
la source
trop compliqué, il suffit de rechercher '| @' et de remplacer la première occurrence. il n'est pas nécessaire de faire une référence arrière avant ou après '| @', sed le laissera de toute façon.
Akira
Ah, merci pour l'allusion. =) J'utilise rarement sed. Ma solution remplace "| bla @" par "| bla", cependant. Je sais pas si c'est ce que ça devrait être.
Jens
Votre dernière commande doit être soit sed 's/^\(.*\?\|.*\?\)@/\1/'ou sed -r 's/^(.*?|.*?)@/\1/'(corrections à l'échappement)
Dennis Williamson
0

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:

sed 's/\(^[^|]|\)@/\1/'

Ceci ne modifie pas les lignes qui ont un PIPE supplémentaire avant la séquence PIPE AT.

kdo
la source