我正在编写一个脚本,除其他外,它将从文件中删除一行。要删除的行存储在变量中,并从命令行参数构造。这是我到目前为止所做的:
#!/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:未知命令:`$'
我意识到在这一点上有一些简单的语法问题,我搞砸了,但对于我的生活,我找不到它。有什么想法吗?
答案 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