Вставьте (или добавьте) строку, заканчивающуюся обратной косой чертой (\), используя sed - PullRequest
2 голосов
/ 05 ноября 2010

В Linux (BusyBox, QNAP-NAS) я хочу добавить дополнительный путь к моему .bashrc файлу через скрипт с использованием sed.Соответствующая часть файла выглядит следующим образом:

[...]
export PATH=\
/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/local/bin
[...]

Дополнительная строка для вставки (в позиции 4 в исходном файле) - /opt/bin:/opt/sbin:\.Чтобы это сделать, мой однострочный sed выглядит следующим образом:

sed '4i/opt/bin:/opt/sbin:\\' .bashrc > .bashrc.tmp

, правильно экранируя обратную косую черту.Каким-то образом sed преобразует оставшиеся \' в новую строку, поедая обратную косую черту, в результате чего:

[...]
export PATH=\
/opt/bin:/opt/sbin:

/bin:\
[...]

Добавление третьей обратной косой черты дает мне обратную косую черту, но все равно добавляет новую строку, поэтому

sed '4i/opt/bin:/opt/sbin:\\\' .bashrc > .bashrc.tmp

приводит к

export PATH=\
/opt/bin:/opt/sbin:\

/bin:\

Если я добавлю лишний пробел в моей команде sed

sed '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp

все будет хорошо, но я получу лишний пробел в конце строкиа также.

export PATH=\
/opt/bin:/opt/sbin:\  # extra space here

/bin:\

На данный момент уловка была второй командой sed, удаляющей завершающие пробелы

#!/bin/sh

sed -e '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp
sed -e 's/[ \t]*$//' .bashrc.tmp > .bashrc.tmp2  # change \t to real tab

Но все же я удивляюсь, почему sed превращает \' в новую строку, а как решить вышеописанную работу с помощью простого однострочного?Как я могу вставить (или добавить) строку с обратной косой чертой, используя sed?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

Вот обходной путь:

sed '4s|^|/opt/bin:/opt/sbin:\\\n|' .bashrc
1 голос
/ 24 августа 2012

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

Моя команда выглядит следующим образом:

sed "1i #backtrace_script\n#!/bin/sh\ngeany -si \\\\" \

, что приводит к

 #!/bin/sh
 geany -si \
0 голосов
/ 05 ноября 2010

Похоже на ошибку в busybox sed.Работает нормально с GNU sed 4.2.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...