$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
La sed
commande ci- dessus remplace le nouveau caractère de ligne par la chaîne "chaîne". Mais je ne connais pas le sens des :a;$!N;s/\n/string/;ta
guillemets simples. Je connais la partie médiane s/\n/string/
. Mais je ne connais pas la fonction de la première ( :a;$!N;
) et de la dernière ( ta
) partie.
sed
text-processing
Avinash Raj
la source
la source
Réponses:
Ce sont les commandes, certes énigmatiques
sed
. Plus précisément (deman sed
):Ainsi, le script que vous avez publié peut être décomposé en (espaces ajoutés pour plus de lisibilité):
Fondamentalement, ce que cela fait pourrait être écrit en pseudocode comme
Vous pouvez mieux comprendre cela avec un exemple d'entrée plus complexe:
Je ne sais pas vraiment pourquoi cela
!$
est nécessaire. Autant que je sache, vous pouvez obtenir la même sortie avecla source
$!
pas le cas!$
. Cependant, cela pourrait aussi être le cas!N
et non$!
.!N
ou$!
. Donc, je continue de penser que la dernière ligne est la nouvelle ligne ou l'EOF.$!
à une «plage» d'adresses avec un opérateur de complément postfix - donc$!N
(faireN
partout sauf pour l'adresse$
) est vraiment la même syntaxe que quelque chose commem,n!d
(supprimer tout sauf les lignesm
versn
).:
est analogue augoto
label, et en fait:
était un label goto dans le shell Thompson, donc il serait familier aux gens à l'époque utilisant sed et le shell ThompsonJe poste cette réponse car je vois beaucoup de confusion sur la raison pour laquelle la dernière ligne est exclue lors de l'exécution
N
(via la chaîne d'adressage de ligne$!
) et parce que l'OP était confus quant à la signification de:a;$!N;
dans une commande sed , pas seulement dans celle spécifique qu'il a postée .Eh bien, l'avantage d'utiliser
$!N
au lieu deN
n'est pas évident dans les exemples proposés (par l'OP et par @terdon), car aucune commande "importante" (continuer à lire) n'est exécutée sur la dernière ligne après laN
commande. (En effet, le résultat est le même si l'on supprime cette adresse de ligne.)Dans un exemple plus complexe (par exemple, remplacer
this sentence
dans un fichier, les deux mots apparaissant parfois sur une ligne et d'autres fois sur deux lignes), l'exclusion de la dernière ligne de laN
commande pourrait être cruciale! Si la dernière ligne n'est pas exclue, lors de l'exécutionN
sur elle,sed
frappeEOF
et quitte immédiatement, empêchant toutes les commandes suivantes (commandes de branchement également, à savoirt
etb
) d'être exécutées.Dans les exemples trop simplistes illustrés, nous pouvons supprimer
$!
et laissersed
échouer l'exécutionN
et le retour en toute sécurité car las
commande abandonnée ne ferait rien si elle était exécutée, car il n'y a pas\n
de correspondance.la source