使用sed删除文件中不符合某个模式的行

5

我希望从文件中删除所有不符合以下形式的行:

something.something,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或类似工具来完成。


它在DEMO中运行正常。 - Braj
你可以使用 grep -v。 - aioobe
3个回答

4
您可以成功使用 grep
grep -E '^[^.]+\.[^,]+,[^,]+,[^,]+$' file > temp
mv temp file

这是我使用的解决方案。我太专注于使用sed而没有考虑使用grep。简单而有效,谢谢。 - Jxek
grep更简单,但如果您喜欢内联编辑,则最好使用sed。 - Avinash Raj

4
grep -E '^[^.]+\.[^.]+(,[^,]+){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

注意:如果提供suffix,则-i[suffix]会创建一个备份。

通过awk实现

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接