J'utilise donc "sed" sur Linux depuis un moment, mais j'ai eu un peu de mal à essayer de l'utiliser sur OSX car "POSIX sed" et "GNU sed" ont tellement de petites différences. Actuellement, j'ai du mal à insérer une ligne de texte après un certain numéro de ligne. (dans ce cas, ligne 4)
Sous Linux, je ferais quelque chose comme ceci :
sed --in-place "4 a\ mode '0755'" file.txt
Donc sur OSX j'ai essayé ceci :
sed -i "" "4 a\ mode '0755'" file.txt
Cependant, cela continue de me donner une erreur "caractères supplémentaires après \ à la fin d'une commande". Des idées sur ce qui ne va pas ici? Ai-je une faute de frappe ? Ou est-ce que je ne comprends pas une autre différence entre les versions de sed ?
Réponse acceptée :
À proprement parler, la spécification POSIX pour sed
nécessite une nouvelle ligne après a\
:
[1addr]a\ text
Écrivez le texte sur la sortie standard comme décrit précédemment.
Cela rend l'écriture d'une ligne un peu pénible, ce qui est probablement la raison de l'extension GNU suivante pour le a
, i
, et c
commandes :
En tant qu'extension GNU, si entre le
a
et la nouvelle ligne est autre qu'un espace blanc-\
séquence, puis le texte de cette ligne, en commençant par le premier caractère non blanc après lea
, est considéré comme la première ligne du texte bloc. (Cela permet une simplification dans le script d'un ajout d'une ligne.) Cette extension fonctionne également avec lei
etc
commandes.
Ainsi, pour être portable avec votre sed
syntaxe, vous devrez inclure une nouvelle ligne après le a\
d'une certaine manière. Le moyen le plus simple consiste simplement à insérer une nouvelle ligne entre guillemets :
$ sed -e 'a\
> text'
(où $
et >
sont des invites du shell). Si vous trouvez que c'est pénible, bash
[1] a le $' '
syntaxe de guillemets pour insérer des échappements de style C, donc utilisez simplement
sed -e 'a\'$'\n''text'
[1] et mksh (r39b+) et certains shells bourne non bash (par exemple, /bin/sh dans FreeBSD 9+)