【问题标题】:Removing lines from a file that don't match a pattern using sed使用 sed 从文件中删除与模式不匹配的行
【发布时间】:2014-08-19 12:49:20
【问题描述】:

我想从文件中删除所有没有格式的行:

某事,某事,某事,某事

例如,如果文件如下:

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工作
  • 你可以使用 grep -v

标签: regex bash sed


【解决方案1】:

您可以成功使用grep

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

【讨论】:

  • 这是我使用的解决方案。我太专注于使用 sed 来考虑使用 grep。简单而且有效,谢谢。
  • grep 更简单,但对于内联编辑,如果您更喜欢 sed 会更好。
【解决方案2】:
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 
    

    【讨论】: