Вставить вкладку, создающую проблемы: Sed рассматривает первую вкладку как буквенный символ, а затем как пробел после - PullRequest
0 голосов
/ 15 января 2019

Я использую sed для вставки строки в отформатированный документ apache conf, и я хотел бы сохранить форматирование. Для этого мне нужно вставить строку с вкладками.

Вот моя команда:

 sed -i "/DocumentRoot\s\/data\/iga\/wwwroot/a \t\t\tServerName itWorked" /etc/apache2/sites-available/default-ssl.conf

А вот и вывод:

                DocumentRoot /data/iga/wwwroot
t               ServerName itworked

Мне нужно, чтобы sed обрабатывал первый «\ t» как вкладку, а не как «t», так что вывод будет следующим:

                DocumentRoot /data/iga/wwwroot
                ServerName itWorked

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Пожалуйста, попробуйте вместо:

sed -i "/DocumentRoot\s\/data\/iga\/wwwroot/a\\\t\t\tServerName itWorked" /etc/apache2/sites-available/default-ssl.conf

или

sed -i '/DocumentRoot\s\/data\/iga\/wwwroot/a\\t\t\tServerName itWorked' /etc/apache2/sites-available/default-ssl.conf
# enclosed with single quotes

Команда a ожидает обратную косую черту перед текстом замены, тогда вам нужно добавить дополнительные обратные слеши.

Обратите внимание, что обозначение \t в замене поддерживается GNU sed только. Стандарт sed нет.

0 голосов
/ 15 января 2019

Просто используйте awk:

$ awk '{print} sub(/DocumentRoot\s\/data\/iga\/wwwroot.*/,"ServerName itworked")' file
                        DocumentRoot /data/iga/wwwroot
                        ServerName itworked

Выше будет использоваться любой интервал, присутствующий в строке «DocumentRoot», вместо того, чтобы требовать от вас снова указать интервал в вашей команде. Чтобы сделать изменения «встроенными», добавьте -i inline, и это будет работать с GNU awk точно так же, как -i работает с GNU sed - awk -i inline '...' file.

...