web-dev-qa-db-fra.com

sed ajouter une ligne (sans espaces au début) après la correspondance (script utilisant des variables)

S'il vous plaît aider avec des espaces lorsque le script ajoute une ligne après le modèle recherché

$ cat test.txt 
   test    server:1 

 prod  server 1

$ cat ./check.sh 
#!/bin/bash
#
search="   test    server:1"
add="                 test        server:1000"
echo "starting"
sed -e "/${search}/a${add}" ./test.txt

$ ./check.sh 
starting
   test    server:1 
test        server:1000

 prod  server 1

espaces avant: serveur de test: 1000 sont perdus. Comment puis-je réparer cela?

1
Vladimir Izmalkov

Vous devez quitter l'espace, sinon sed l'ignorera car /pattern/atext et /pattern/a text et /pattern/a text sont interprétés de la même manière.

Utilisez ceci:

sed -e "/${search}/a${add// /\\ }" ./test.txt
1
pLumo

Ce que vous voyez est une différence subtile entre la commande étendue GNU

a text

Ajouter du texte après une ligne. Il s’agit d’une extension GNU de la commande standard - voir ci-dessous pour plus de détails.

dans lequel le manuel note que

Les espaces après la commande a sont ignorés.

et la forme originale et plus portable

a\
text

qui ne supprime pas les grands espaces. Il existe plusieurs manières d’obtenir ce dernier comportement dans un "one-liner", par exemple.

$ sed "/${search}/a\\${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

(notez que le \ doit être échappé entre guillemets) ou

$ sed "/${search}/a"'\'"${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

ou

$ sed -e "/${search}/a\\" -e "${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

(notez cependant que le dernier repose sur une autre extension GNU, -e).

1
steeldriver