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

Linux 无法在shell脚本中删除文件中的行,linux,bash,shell,sed,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

我必须从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

为什么??如何使其工作?

这只是在sed命令周围使用了不正确的引号,因此变量没有被使用。忽略一个事实,即当1个工具就足够时,您不必要地使用3个工具,解决方法如下:

sed -e "${linenumber}d" "$FILE"
也许您的需求比看起来更复杂,但我建议您将整个脚本更改为:

awk -v serverip="$serverip" '!($0 ~ serverip)' "$FILE"
这将打印不包含shell变量
$serverip
的每一行。假设您已转义变量中存在的任何正则表达式元字符

或者(更简洁地说):

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

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

如果您不熟悉结尾处的
1
,这只是一种常见的速记,它会导致awk打印每一行(
1
总是正确的,默认操作是
{print}
)。

可能您想使用
sed-i
修改文件,而不是将结果打印到标准输出?或者,sed而不是awk:
sed/$serverip/d”“$FILE”
——关于regex元字符的警告是一样的。默认情况下我总是选择awk,但是是的,这可能更好,谢谢。我同意:只要我键入
awk -v serverip="$serverip" '$0 ~ serverip { print "IP exists"; print NR; next } 1' "$FILE"