我觉得我已经太接近问题了,我只能靠自己来解决它,尽管我确信它很容易解决。
我正在使用带有SHELL脚本的NAS为我的Raspberry PI自动收集数据并将其分发到我的其他设备上。所以我决定包含一个删除选项,因为否则删除文件会很麻烦,因为树莓会一直从其他设备上复制它。当脚本运行时,它会创建一个文件:del_tmp_ $ ip.txt,其中是directorys和要从del_ $ ip.txt删除的文件(Not del_TMP_ $ ip.txt)。 它看起来像这样:
test/delete_me.txt
test/hello/hello.txt
pi.txt
我试图删除行viáawk,这就是我现在已经走了多远:
while read r; do
gawk -i inplace '!/^'$r'$/' del_$ip.txt
done <del_tmp_$ip.txt
如果来自del_tmp_ $ ip.txt的行告诉gawk删除pi.txt它没有问题,但如果字符串包含像test / delete_me.txt这样的斜杠它不起作用:
“意外的换行符或字符串结尾”
然后它指向最后一个斜杠。
我无法通过手动向后移动前进速度,因为我不知道是否会有多少斜线。取决于包含要删除的信息的文件行。
我希望你能帮助我!
答案 0 :(得分:0)
在awk评估它之前,永远不要允许shell变量扩展成为awk脚本文本的一部分(这是你用'!/^'$r'$/'
做的事情)并且总是引用你的shell变量(所以正确的shell语法会已经'!/^'"$r"'$/'
如果它不是错误的方法,无论如何)。编写该命令的正确语法是
awk -v r="$r" '$0 !~ "^"r"$"' file
但是你说你想要一个字符串比较,而不是正则表达式,所以它只是简单地说:
awk -v r="$r" '$0 != r' file
当然你根本不需要shell循环:
while read r; do
gawk -i inplace '!/^'$r'$/' del_$ip.txt
done <del_tmp_$ip.txt
你只需要1个awk命令:
gawk -i inplace 'NR==FNR{skip[$0];print;next} !($0 in skip)' "del_tmp_$ip.txt" "del_$ip.txt"