我必须从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
为什么呢?如何让它运作?
答案 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} })。