如何从变量中的字符串中转义两个斜杠

时间:2018-05-03 16:33:46

标签: bash sed

我目前正在编写一个脚本,如果在系统中找不到,则会从文件中删除目录名称。但是,我无法让我的sed命令工作。

当前命令:

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

$row扩展为//maindir/subdir/testing< ---正在删除的目录

但我一直收到以下错误:

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

有什么想法在这里发生了什么?或者,有没有更好的方法来逃避那些前瞻性的斜杠?

3 个答案:

答案 0 :(得分:2)

我知道这个问题是重复的。尽管如此:

如果更改分隔符,则必须在字符串中转义那些,所以只需咬住子弹并转义斜杠:

$ 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手册中的Shell Parameter Expansion

答案 1 :(得分:1)

您不必滥用正则表达式进行文字文本替换。 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'
/ = /

答案 2 :(得分:0)

您可以使用其他分隔符:

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

我们在此处使用#作为分隔符,因为$row不包含#。 (如果您无法确保输入数据使用其他内容)。此外,在这种情况下,您需要转义起始分隔符:\#

来自POSIX sed

  

在上下文地址中,构造“\ cBREc”,其中c是反斜杠或换行符以外的任何字符,应与“/ BRE /”相同。如果c指定的字符出现在反斜杠后面,那么它应被视为该字面字符,它不会终止BRE。例如,在上下文地址“\ xabc \ xdefx”中,第二个x代表自身,因此BRE是“abcxdef”。