Как избежать обратной косой черты в сценарии sed, встроенном в сценарий bash - PullRequest
8 голосов
/ 03 января 2012

Я хочу отредактировать файл через скрипт sed в скрипте bash. Я хочу, чтобы это было легко поддерживать позже; легко понять и изменить. Строка замены выглядит следующим образом:

PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\]'

В идеальном мире это было бы так:

sed -i "s/^PS1.*$/PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\]'/g" /etc/skel/.bashrc

Проблема в том, что bash и sed удаляют \, давая в файле следующий результат:

PS1='[e[1;32m][@h W]$[e[0m]'

Очевидно, что одинарные кавычки не могут быть использованы. Решение проблемы грубой силы - использовать побеги, но для этого я получаю очень уродливую линию:

sed -i "s/^PS1.*$/PS1='\\\\[\\\\e[1;32m\\\\][\\\\u@\\\\h \\\\W]\\\\$\\\\[\\\\e[0m\\\\]'/g" /etc/skel/.bashrc

Я хочу, чтобы скрипт был читаемым и самодостаточным (без использования внешних файлов). Есть ли альтернативы вышеперечисленному?

Ответы [ 4 ]

5 голосов
/ 04 января 2012

Bash printf может добавить необходимые экранированные символы, оставляя строку для вставки в читаемой, редактируемой форме.

sed -i "s/^PS1.*$/$(printf "%q" "PS1='\[\e[1;32m\][\u@\h \W]$\[\e[0m\]'")/g" /etc/skel/.bashrc

Если не попытаться вставить все это в одну строку, все становится понятнее.

REPL=$(printf "%q" "PS1='\[\e[1;32m\][\u@\h \W]$\[\e[0m\]'")
sed -i "s/^PS1.*$/$REPL/g" /etc/skel/.bashrc
4 голосов
/ 03 января 2012

Это может работать для вас:

echo "PS1=abc" |
sed 's/^PS1.*$/PS1='\''\\[\\e[1;32m\\][\\u@\\h \\W]\\$\\[\\e[0m\\]'\''/'
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\]'
1 голос
/ 03 января 2012

Как насчет этого:

sed -i 's/^PS1.*$/PS1=SINGLEQUOTESLASH[SLASHe[1;32mSLASH][SLASHu@SLASHh SLASHW]SLASH$SLASH[SLASHe[0mSLASH]SINGLEQUOTE/g' /etc/skel/.bashrc
sed -i "s/SINGLEQUOTE/'/g" /etc/skel/.bashrc
sed -i "s/SLASH/\\/g" /etc/skel/.bashrc

Выполнение этого за два прохода менее эффективно, но для большинства людей незаметно еще несколько микросекунд.

1 голос
/ 03 января 2012

Используйте файл сценария sed с sed -f. Эта альтернатива тоже не очень хороша, потому что она подразумевает наличие дополнительного файла, но, по крайней мере, вы избегаете экранирования оболочки.

...