0
votes

Est la substitution de SED auto en place?

J'ai ce code, que je souhaite le remplacement d'un motif spécifique, mais pas de remplacement multi-lieux.

echo "ss qq" | sed  ":loop; s/ss/qq/g; s/qq/dd/g; t loop;"


3 commentaires

SED Les commandes séparées du semi-colon sont exécutées consécutivement, c'est la raison. Voir Ce fil qui peut fonctionner pour vous.


Essayez la solution Publiée ici: Stackoverflow.com/a/26568996/6515775


Si seulement une seule lettre (non Word) doit être modifiée, vous pouvez utiliser tr : écho "ss qq" | tr SQ QD donne qq dd


4 Réponses :


0
votes

Whish, ce serait

qq dd

Ensuite, vous faites la substitution dans l'ordre d'inverser:

Changer SED "S / SS / QQ / g; S / QQ / DD / G;" -> SED "S / QQ / DD / G; S / SS / QQ / g; "


0 commentaires

2
votes

comme pour "pourquoi ça se passe": SED prend la ligne d'entrée par ligne, puis applique chaque commande séquentiellement. Cela devient plus clair si vous regardez la sortie de débogage de GNU SED (4.6 ou plus récent) pour votre commande:

$ sed --debug 's/ss/qq/g;s/qq/dd/g' <<< 'ss qq'
SED PROGRAM:
  s/ss/qq/g
  s/qq/dd/g
INPUT:   'STDIN' line 1
PATTERN: ss qq           # Pattern space before first command is applied
COMMAND: s/ss/qq/g
MATCHED REGEX REGISTERS
  regex[0] = 0-2 'ss'
PATTERN: qq qq           # Pattern space before second command is applied
COMMAND: s/qq/dd/g
MATCHED REGEX REGISTERS
  regex[0] = 0-2 'qq'
PATTERN: dd dd
END-OF-CYCLE:
dd dd


1 commentaires

@ M.TEE Il nécessite GNU SED 4.6 ou plus récent, mais le principe est identique - la sortie de débogage est juste pour l'illustration.



0
votes

Peut-être que c'est le comportement de la commande y /// que vous recherchez: xxx

Ceci transformera tout s dans q et tous q dans d caractère par caractère.


0 commentaires

0
votes

Ceci pourrait fonctionner pour vous (GNU SED):

sed 's/ss/\n/g;s/qq/dd/g;s/\n/qq/g' file 


0 commentaires