Как избежать двух слэшей из строки в переменной - PullRequest
0 голосов
/ 03 мая 2018

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

Текущая команда:

sed -i '/"$row"/d' DirtoDelete.txt 

$row расширяется до //maindir/subdir/testing <--- удаляемый каталог </p>

но я продолжаю получать следующую ошибку:

sed: -e expression #1, char 27: expected newer version of sed

Есть идеи, что здесь происходит? Или есть лучший способ избежать этих ведущих слешей?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Я знаю, что есть дубликат этого вопроса. Тем не менее:

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

$ row=//maindir/subdir/testing
$ echo "${row//\//\\/}"
\/\/maindir\/subdir\/testing
$ echo $'first\nline with '"$row"$'\nlast'
first
line with //maindir/subdir/testing
last
$ echo $'first\nline with '"$row"$'\nlast' | sed "/${row//\//\\/}/d"
first
last

См. Расширение параметров оболочки в руководстве по bash.

0 голосов
/ 03 мая 2018

Вам не нужно злоупотреблять регулярными выражениями для замещения грамотного текста. Функция awk index находит подстроки.

$ cat r
d="$1"; shift
awk -v d="$d" '{
    s = $0
    while (i = index(s, d))
        s = substr(s, 1, i - 1) substr(s, i + length(d))
    print s
}' "$@"

Использование:

$ echo '/a/b = /a/b' | sh r 'a/b'
/ = /
0 голосов
/ 03 мая 2018

Вы можете использовать другой разделитель:

sed -i "\#${row}#d" DirtoDelete.txt

Мы используем # в качестве разделителя, потому что $row не содержит #. (Если вы не можете гарантировать, что для ваших входных данных используйте что-то еще). Кроме того, вам нужно экранировать начальный разделитель в этом случае: \#:

С POSIX sed :

В контекстном адресе конструкция "\ cBREc", где c - любой символ, кроме обратной косой черты или новой строки, должна быть идентична "/ BRE /". Если символ, обозначенный буквой c, появляется после обратной косой черты, то он считается тем буквальным символом, который не должен заканчиваться BRE. Например, в контекстном адресе «\ xabc \ xdefx» второй x обозначает себя, так что BRE - это «abcxdef».

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