我有一个包含字符串和数字的 CSV 文件(例如 temp.csv)。我需要删除文件中行开头包含特定字符串模式的行。例如,这是我的文件 -
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
我正在req_file_curr
命令中 写入一个模式~ $ req_file_curr=req1
echo "${req_file_curr}"
给出输出为req1
然而,当在一个sed
命令,如下所示:
sed '/\"${req_file_curr}\"/d' temp.csv
给出输出为
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
我期望输出为
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
如何使用 shell 中的变量作为模式来查找sed
或者awk
?
答案1
您需要将sed
模式用双引号引起来,以便 shell 可以在将变量传递给之前展开变量sed
:
sed "/^${req_file}/d" temp.csv
您还需要使用^
锚点来指示sed
此模式需要出现在行的开头。
答案2
不需要awk
或sed
这里:
grep -v "^$req_file_curr," file
请注意(如 forsed
或awk
虽然在较小程度上),假设$req_file_curr
不包含正则表达式运算符(如.
, *
...)。
如果确实如此,您必须转义这些字符,或者使用awk
,您可以使用使用其index()
功能的方法:
S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file
答案3
您已设置req_file_curr
但使用req_file
.并且您的sed
命令将不起作用,因为 shell 变量无法在您的sed
命令中扩展。
你可以试试这个:
$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
或使用sed
双引号:
sed "/${req_file_curr}/d" file
并使用awk
:
$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
答案4
ed 解决方案就像这样。
req_file_curr=req1
printf '%s\n' "g/^$req_file_curr/d" w | ed -s temp.csv
它会就地编辑文件,因此在针对您的文件运行此操作之前请先进行测试。