从shell脚本中删除文件中完全匹配的行

时间:2012-05-15 13:24:52

标签: unix sed

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

#!/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,char 3:未知命令:`$'

我意识到在这一点上有一些简单的语法问题,我搞砸了,但对于我的生活,我找不到它。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

关键是你必须使用双引号才能扩展变量。否则,sed会按字面意思看到美元符号。

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

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

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

答案 1 :(得分:2)

由于你的行包含 / 字符,因此它会搞乱sed的/regex/分隔符。您可能希望使用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

答案 2 :(得分:1)

试试这个

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

这将使用@作为分隔符,这只能用于替换命令,然后删除空行。

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

更新:

如果您使用的是GNU sed,则可以将命令缩小为

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