2

我正在编写一个脚本,其中包括从文件中删除一行。要删除的行存储在变量中,并由命令行参数构造。这是我到目前为止所拥有的:

#!/bin/sh
repo=$1
devscript=/usr/local/bin/svn-post-commit-update-$repo-dev
livescript=/usr/local/bin/svn-post-commit-update-$repo-live
sudoer="www-data    ALL=(root) NOPASSWD: $devscript, $livescript"
sed -i '//$sudoer/ d' /home/bdugan/t.txt

我收到以下错误:

sed:-e 表达式 #1,字符 3:未知命令:`$'

我意识到此时有一些简单的语法问题我已经搞砸了,但对于我的生活我找不到它。有任何想法吗?

4

3 回答 3

4

关键是您必须使用双引号,以便变量得到扩展。否则,sed从字面上看美元符号。

同样关键的是您的模式包含斜杠。您必须使用备用分隔符:

sed -i "\|$sudoer|d" /home/bdugan/t.txt

选择一个不太可能出现在字符串中的分隔符。

于 2012-05-15T14:01:06.703 回答
2

由于您的行包含/字符,它会弄乱/regex/sed 的分隔符。您可能想使用 awk 并使用字符串相等而不是正则表达式:

awk -v line="$sudoer" '$0 == line {next} {print}' ~/t.txt > ~/t.txt.new &&
mv ~/t.txt ~/t.txt.old &&
mv ~/t.txt.new ~/t.txt
于 2012-05-15T13:35:53.303 回答
1

尝试这个

sed -e "'s@${sudoer}@@'" -e '/^$/d' -i /home/bdugan/t.txt

这将@用作分隔符,仅适用于替换命令,然后删除空行。

编辑:您不应/用作文件名和路径的分隔符,因为它可能会破坏您的sed正则表达式

更新:

如果您正在使用GNU sed,您可以将命令减少到

sed -e "'\@${sudoer}@d'" -i /home/bdugan/t.txt
于 2012-05-15T13:38:51.360 回答