sed добавляют строку (без пробелов вначале) после соответствия (сценарий с помощью переменных)

Помогите с пробелами, когда сценарий добавит строку после искавшего шаблона

$ 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

пробелы прежде: тест server:1000 потерян. Как я могу зафиксировать это?

1
задан 27 November 2018 в 17:40

2 ответа

Необходимо выйти из пространства, иначе sed проигнорирует его потому что /pattern/atext и /pattern/a text и /pattern/a text интерпретируется то же.

Используйте это:

sed -e "/${search}/a${add// /\\ }" ./test.txt
1
ответ дан 7 December 2019 в 13:20

То, что Вы видите, является тонким различием между расширенной командой GNU

a text

Добавление текста после строки. Это - расширение GNU стандарта, который команда - видит ниже для деталей.

в котором руководство отмечает это

Ведущий пробел после команда проигнорирован.

и оригинал и больше портативной формы

a\
text

который не разделяет ведущий пробел. Существует несколько способов получить последнее поведение в "остроте", например.

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

 prod  server 1

(отметьте \ потребности, которых оставят в двойных кавычках) или

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

 prod  server 1

или

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

 prod  server 1

(хотя примечание, что последний полагается на другое расширение GNU, -e).

1
ответ дан 7 December 2019 в 13:20

Другие вопросы по тегам:

Похожие вопросы: