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

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

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

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

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

report  
-th  
-to

这意味着期望的输出将删除所有中间不需要的点和散列,并且将如下所示:

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

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

答案1

使用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 的建议,并随时过来这个聊天室随时提问。

答案2

您可以使用简单的 grep 来实现此目的:

grep -E '^(report|-th|-to)' filename

或者,更短,

grep -E '^(report|-t[ho])' filename

答案3

使用awk

awk '/^report|^-t[ho]/' file

答案4

使用 Perl:

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

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

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

这将创建原始文件的副本filename.bak,并用编辑后的版本覆盖原始文件。

相关内容