GNU/Linux >> Tutoriels Linux >  >> Linux

Insertion Sed sur Osx sur une certaine ligne ?

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 le a , 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 le i et c 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+)


Linux
  1. Convertir une chaîne en hexadécimal sur la ligne de commande

  2. Comment insérer un texte au début d'un fichier ?

  3. sed à insérer lors de la première correspondance uniquement

  4. sed insérer une ligne avec des espaces sur une ligne spécifique

  5. sed - insérer une ligne après X lignes après la correspondance

Comment insérer du texte avant la première ligne d'un fichier ?

Insérer de nouvelles lignes avec des valeurs manquantes (na) ?

Sed Supprimer les caractères de la nouvelle ligne ?

Utilisation de la commande Linux sed avec des exemples

Tutoriel Unix Sed :ajouter, insérer, remplacer et compter les lignes de fichiers

Quelle est la bonne façon d'insérer un onglet dans sed?