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


11

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

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

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

report  
-th  
-to

这意味着所需的输出将删除所有那些中间不需要的点和哈希,并且将如下所示:

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed/ awk/ grep/等任何解决方案,将工作。

Answers:


15

使用sed修改文件的地点:

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file

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

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

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

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

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

旁注

请不要误解我的意图或对此表示冒犯,但我注意到您有很多与正则表达式/文本处理相关的问题。我建议您开始学习sedawkgrep自行提高速度。再说一次,不要误会我的意思,我很乐意为您提供帮助(就像周围的大多数人一样);只是我认为您可以从每天使用这些工具中受益匪浅。

只是为了证明周围的人有帮助,请在下面的评论中考虑@slm的建议,随时可以在此聊天室提问。


1
您的正则表达式似乎不必要地含糊。我认为您实际使用的字符要比您只列出了三个选项的字符更多。
nispio

1
我知道@nispio,但是如果有问题的文件很大,可能会更高效。
Joseph R.

有趣。我一直在测量正则表达式的长度或可读性。我从未考虑过执行速度。我认为我对如何评估它们来判断快速是不够了解,但我认为它也是特定于实现的,对吗?
nispio

3
再重申一下约瑟夫所说的愿意提供帮助的内容,如果您遇到的常见问题与问答风格不符,您可以随时尝试在此网站的聊天室中与我们聊天。chat.stackexchange.com/rooms/26/unix-and-linux。我们中的一些人住在那里8
slm

@slm谢谢你。我将其添加到我的答案中。
Joseph R.

10

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

$ grep -e '^report\|^-th\|^-to' filename

1
节省不了多少,但是您可以将-th/ 组合-to到中-t[ho]
凯文

grep -eegrep
Olivier Dulac

2

使用sed

sed -n -e '/^report\|^-th\|^-to/p' filename

节省不了多少,但是您可以将-th/ 组合-to到中-t[ho]
凯文

1
@Kevin是的。请参阅我与约瑟夫R.的对话中的评论。
nispio


1

发问者指出两点:

  • 想要删除任何不以“ report”或“ -th”或“ -to”开头的行。
  • 所需的输出应删除“所有那些中间不需要的点和哈希(原文如此)”

目前,解决方案着眼于第一点,因此也针对第二点。但是,假设文件较大,如下所示:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
     -  -----

是否需要解决OP的第二点?

sed -r -i.bak '/^[ |.|-]*$/d' input-file 

会执行以下操作:删除可能仅包含空格,点和破折号的多余线条,并保留其余部分,不管是什么。
我认为这两种方法的风险都是文件的性质定义不正确。


0

使用Perl:

perl -ne 'print if /^report|^-t[ho]/' filename > newfile

或者,在就地编辑(如sedperl还将进行临时备份,所以这是不是真的到位编辑):

perl -i.bak -ne 'print if /^report|^-t[ho]/' filename

这将复制称为filename.bak的原始文件,并使用编辑后的版本覆盖原始文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.