sed: что делать с обратной косой чертой? - PullRequest
1 голос
/ 23 февраля 2012

Я хочу изменить одну из ее строк на sed, но в конце этой строки есть обратный слеш:

Some Text that should be changed \

Я использовал:

sed -i "s/$line/$newline/" $MyFile

Сед говорит:

sed: -e expression #1, char 44: unknown option to `s'
sed: -e expression #1, char 84: unterminated `s' command

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Учитывая, что у вас есть:

line="Some Text that should be changed \\"

так что ваш echo "$line" дает:

Some Text that should be changed \

Тогда sed видит:

sed -i "s/Some Text that should be changed \/Your replacement/" yourfile

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

Вам понадобится второй обратный слеш в конце строки. Один из бесчисленных способов сделать это:

case "$line" in
(*\\)  line="$line\\";;
esac

Это просто изобретательство ... но оно имеет преимущество в том, что не выполняет никаких внешних команд для исправления строки. В bash.

также доступны более прямые замены.

Теперь вы можете сделать:

sed -i "s/^$line$/$newline/" $myFile

и до тех пор, пока $newline не содержит ни косых черт, ни обратной косой черты, вы будете в безопасности.

3 голосов
/ 23 февраля 2012

Вам нужно сначала экранировать строку, которую вы используете внутри команды sed, что-то вроде:

line=$(echo $line | sed 's/\\/\\\\/g')

Это превратит его из:

Some Text that should be changed \

в

Some Text that should be changed \\

, что помешает ему избежать последнего разделителя.

1 голос
/ 23 февраля 2012

Одной из вероятных причин является то, что ваш $line или $newline содержит разделитель /.

Пожалуйста, попробуйте некоторые другие разделители, которые не встречаются в ваших шаблонах.

Например1008 *

sed -i "s@$line@$newline@" $MyFile
sed -i "s#$line#$newline#" $MyFile

- редактировать в соответствии с комментариями @ paxdiablo.

Имя переменной $line вводит в заблуждение.Это должен быть шаблон .

Таким образом, вы должны убедиться, что это правильный шаблон, в котором обратная косая черта \ должна быть экранирована с помощью \\

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