Я бы хотел использовать sed
для этого решения, если это возможно. Вот моя ситуация:sed добавить многострочную строку после сопоставления строки с одной строкой
У меня есть многострочная строка, которая будет передана sed
внешними средствами - вероятно, скрипт оболочки или скрипт bash. Строка выглядит следующим образом:
$string = 'blah blah blah\nblahblah\nblah blah blah\n\n'
Я хотел бы запустить sed
команду, которая присоединяет эту строку после того, как найдено совпадение -
sed -i "/^\[org\/gnome\/login-screen\]/a banner-message-text='$string'" /etc/dconf/db/gdm.d/00-mybanner
Проблема заключается в том, что sed
интерпретирует \n
символы как символ новой строки , Обратите внимание, что я понимаю, что способ, которым я объявляю переменную $string
внутри команды sed
, может различаться в зависимости от того, как она выполняется, но даже при вводе строки в командной строке получается многострочный вывод. Таким образом, файл становится похожим:
[org/gnome/login-screen]
banner-message-text='blah blah blah
blablah
blah blah blah
'
banner-message-enable=true
Это вызывает dconf update
бросить ошибку. Я надеюсь, чтобы получить файл, чтобы выглядеть следующим образом:
[org/gnome/login-screen]
banner-message-text='blah blah blah\nblablah\nblah blah blah\n\n'
banner-message-enable=true
Но я не могу показаться, чтобы получить sed
, чтобы остановить себя от интерпретации \n
«с. Спасибо!
EDIT - Полного контекст с внедренным решением (@ том- Фенек) с использованием кукол:
$banner_msg = 'blah blah blah\nblahblah\nblah blah blah\n\n'
$comply_cmd = "find /etc/dconf/db/gdm.d -maxdepth 1 -type f -print0 | xargs -0 sed -i '/^banner-message-text=/d' || /bin/true && \
(grep -q \"^\[org/gnome/login-screen\]\" /etc/dconf/db/gdm.d/99-banner && \
sed -i \"/^\[org\/gnome\/login-screen\]/a banner-message-text='\$(printf '%q' \"${banner_msg}\")'\" /etc/dconf/db/gdm.d/99-banner) || \
(echo -e \"\n\[org/gnome/login-screen]\" >> /etc/dconf/db/gdm.d/99-banner && \
echo \"banner-message-text='${banner_msg}'\" >> /etc/dconf/db/gdm.d/99-banner)"
$unless_cmd = "grep -q \"^banner-message-text='\$(printf '%q' \"${banner_msg}\")'$\" /etc/dconf/db/gdm.d/99-banner"
exec { 'gdm-banner-msg':
path => '/sbin:/bin:/usr/sbin:/usr/bin',
umask => '022',
provider => shell,
command => $comply_cmd,
unless => $unless_cmd,
notify => Exec['dconf-update'],
}
Спасибо вам всем!
http://unix.stackexchange.com/questions/140763/replace-n-by-a-newline-in-sed-portable – user3159253
Все три ответа были полезны, но я выбрал @ tom-fenech, потому что он логично и последовательность команд более сложна, чем размещена. Используя его тактику, я могу установить одну переменную '$ string' с нормальными escape-последовательностями и использовать' printf '% q'', когда мне нужно запустить 'grep' или' sed', но также использовать оригинал, когда мне нужно запустить 'echo' или' echo -e'. – liberteh