根据上一个命令中的变量,使用 awk 或 sed 从文件中删除行

Dhr*_*uuv 2 sed awk text-processing

我有一个包含字符串和数字的 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
Run Code Online (Sandbox Code Playgroud)

req_file_curr在命令中 写一个模式~ $ req_file_curr=req1

echo "${req_file_curr}" 给出输出为 req1

但是,在sed命令中使用它时,如下所示:

sed '/\"${req_file_curr}\"/d' temp.csv
Run Code Online (Sandbox Code Playgroud)

给出输出为

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
Run Code Online (Sandbox Code Playgroud)

我期待输出为

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
Run Code Online (Sandbox Code Playgroud)

如何使用 shell 中的变量作为模式来查找 insedawk

Jos*_* R. 5

您需要将sed模式用双引号括起来,以便 shell 可以在将变量传递给之前展开变量sed

sed "/^${req_file}/d" temp.csv
Run Code Online (Sandbox Code Playgroud)

您还需要使用^锚点来表明sed该模式需要出现在行首。


Sté*_*las 5

不需要awksed在这里:

grep -v "^$req_file_curr," file
Run Code Online (Sandbox Code Playgroud)

请注意(例如 forsedawk尽管在较小程度上),它假定$req_file_curr不包含正则表达式运算符(例如.*...)。

如果是这样,您必须转义这些字符,或者使用awk,您可以使用使用其index()功能的方法:

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file
Run Code Online (Sandbox Code Playgroud)