Ce sont les commandes, certes énigmatiques sed
. Plus précisément (de man sed
):
: label
Libellé pour les commandes b et t.
étiquette t
Si as /// a effectué une substitution réussie depuis la dernière ligne d'entrée et depuis la dernière commande t ou T, branchez-vous sur étiquette; si l'étiquette est omise, branchez-vous à la fin du script.
n N Lire / ajouter la ligne d'entrée suivante dans l'espace de motif.
Ainsi, le script que vous avez publié peut être décomposé en (espaces ajoutés pour plus de lisibilité):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
Fondamentalement, ce que cela fait pourrait être écrit en pseudocode comme
while (not end of line){
append current line to this one and replace \n with 'string'
}
Vous pouvez mieux comprendre cela avec un exemple d'entrée plus complexe:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Je ne sais pas vraiment pourquoi cela !$
est nécessaire. Autant que je sache, vous pouvez obtenir la même sortie avec
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'