使用sed从文件中删除与模式不匹配的行

时间:2014-08-19 12:49:21

标签: regex bash sed

我想删除的文件中的所有行:

  

something.something,东西,什么

例如,如果文件如下:

A sentence, some words  
ABCD.CP3,GHD,HDID  
Hello. How are you?  
A.B,C,D  
dbibb.yes,whoami,words  

我会留下:

ABCD.CP3,GHD,HDID  
A.B,C,D  
dbibb.yes,whoami,words

如果我匹配了我不想删除的模式,我尝试分支到sed脚本的末尾,但是如果它不匹配则继续并删除该行:

cp $file{,.tmp}
sed "/^.+\..+,.+,.+$/b; /.+/d" "$file.tmp" > $file
rm "$file.tmp"

但这似乎没有任何影响。

我想我可以逐行读取文件,检查是否与模式匹配,如果有,则将其输出到文件中,但我想使用sed或类似文件。

3 个答案:

答案 0 :(得分:4)

您可以成功使用grep

grep -E '^[^.]+\.[^,]+,[^,]+,[^,]+$' file > temp
mv temp file

答案 1 :(得分:4)

grep -E '^[^.]+\.[^.]+(,[^,]+){2}$'

答案 2 :(得分:3)

您可以打印与此something.something,something,something模式匹配的行,而不是删除不符合模式的行。

通过sed,

$ sed -n '/^[^.]*\.[^,]*,[^,]*,[^,.]*$/p' file
ABCD.CP3,GHD,HDID  
A.B,C,D  
dbibb.yes,whoami,words

使用内联编辑选项-i[suffix]保存所做的更改。

sed -ni.bak '/^[^.]*\.[^,]*,[^,]*,[^,.]*$/p' file

注意: -i[suffix]如果提供suffix则进行备份。

通过awk,

$ awk '/^[^.]*\.[^,]*,[^,]*,[^,.]*$/{print}' file
ABCD.CP3,GHD,HDID  
A.B,C,D  
dbibb.yes,whoami,words