我目前正在编写一个脚本,如果在系统中找不到,则会从文件中删除目录名称。但是,我无法让我的sed命令工作。
当前命令:
sed -i '/"$row"/d' DirtoDelete.txt
$row
扩展为//maindir/subdir/testing
< ---正在删除的目录
但我一直收到以下错误:
sed: -e expression #1, char 27: expected newer version of sed
有什么想法在这里发生了什么?或者,有没有更好的方法来逃避那些前瞻性的斜杠?
答案 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”。