从给定的一组模式中删除不以模式开头的行

Ran*_*han 11 grep sed awk text-processing

我有一个包含如下数据的文件:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.
Run Code Online (Sandbox Code Playgroud)

问题:我想删除任何不以以下字符串开头的行:

report  
-th  
-to
Run Code Online (Sandbox Code Playgroud)

这意味着欲望输出将删除所有中间不需要的点和散列,看起来像这样:

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc
Run Code Online (Sandbox Code Playgroud)

sed// awk/ grepetc 任何可行的解决方案。

Jos*_* R. 15

使用sed修改文件的地点:

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file
Run Code Online (Sandbox Code Playgroud)

这指示sed删除所有与模式不匹配的行。模式本身是^(行首),后跟任一report-t后跟任一ho

您应该注意,这不是实际的就地修改:sed创建一个临时备份副本并用它覆盖原始文件。

如果您想sed保留原始文件的备份副本(如果文件包含关键数据,这可能是个好主意),请为-i交换机添加扩展名以创建备份文件:

sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file
Run Code Online (Sandbox Code Playgroud)

将修改your_file并创建一个名为 的原始备份your_file.bak

旁注

请不要误解我的意图或对此感到冒犯,但我注意到您有许多类似的正则表达式/文本处理相关问题。我建议您开始学习sedawk并自学grep以帮助加快您的工作效率。再说一次,不要误会我的意思,我很乐意提供帮助(就像这里的大多数人一样);只是我认为您可以从日常使用的这些工具中受益匪浅。

只是为了证明这里的人有多大帮助,请在下面的评论中考虑@slm 的建议,并随时访问此聊天室提出问题。

  • 重申约瑟夫所说的愿意提供帮助,如果您有不适合问答风格的一般问题,您可以随时尝试在本网站的聊天室与我们聊天。http://chat.stackexchange.com/rooms/26/unix-and-linux。我们几个人住在那里 8-) (3认同)
  • 您的正则表达式似乎不必要地神秘。我认为您实际上使用的字符比您刚刚明确列出的三个选项要多。 (2认同)

pra*_*tri 10

您可以为此使用简单的 grep:

$ grep -e '^report\|^-th\|^-to' filename
Run Code Online (Sandbox Code Playgroud)