我有一個包含字串和數字的 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
它會就地編輯文件,因此在針對您的文件執行此操作之前請先進行測試。