无法删除shell脚本中的文件行

时间:2015-10-09 13:11:34

标签: linux bash shell sed

我必须从shell脚本中删除文件中的一行。

我正在尝试这个:

linenumber=0
##CHeck If server IP exists
if grep -wq $serverip $FILE; then
        echo "IP exists"
        linenumber=$(awk -v serverip="$serverip" '$0 ~ serverip {print NR}' $FILE)
        echo "$linenumber"
        sed -e '${$linenumber}d' $FILE

fi

基本上我提取行号,然后想删除它。

sed -e '1d' $FILE  --> WOrks on CLI but inside script does not work

为什么呢?如何让它运作?

1 个答案:

答案 0 :(得分:3)

这只是在sed命令周围使用错误引号的情况,因此未使用该变量。当1满足时,忽略你不必要地使用3个工具的事实,修复就是:

sed -e "${linenumber}d" "$FILE"

也许您的要求比看上去要复杂,但我建议您将整个脚本更改为:

awk -v serverip="$serverip" '!($0 ~ serverip)' "$FILE"

这将打印不包含shell变量$serverip的每一行。假设您已转义变量中存在的任何正则表达式元字符。

或者(更简洁):

sed "/$serverip/d" "$FILE"

如果您确实希望打印出消息(我认为它们是用于调试),那么这很容易实现:

awk -v serverip="$serverip" '$0 ~ serverip { print "IP exists"; print NR; next } 1' "$FILE"

如果你最后不熟悉1,这只是一个常见的简写,导致awk打印每一行(1始终为true,默认操作为{{1} })。