我有一个包含如下数据的文件:
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
.. --.
问题:我想删除任何不以以下字符串开头的行:
report
-th
-to
这意味着期望的输出将删除所有中间不需要的点和散列,并且将如下所示:
report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc
sed
// awk
/ grep
etc 任何可行的解决方案。
答案1
使用sed
就地修改文件:
sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file
这指示sed
删除所有与模式不匹配的行。模式本身是^
(行首),后跟 或report
,-t
后跟h
或o
。
您应该注意,这不是实际的就地修改:sed
创建临时备份副本并用它覆盖原始文件。
如果您想sed
保留原始文件的备份副本(如果文件包含关键数据,这可能是个好主意),请为交换机提供-i
扩展名以创建备份文件:
sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file
将修改your_file
并创建名为 的原始备份your_file.bak
。
附注
请不要误解我的意图或对此感到生气,但我注意到您有许多类似的正则表达式/文本处理相关问题。我建议你开始学习sed
,awk
并grep
依靠自己来帮助提高你的生产力。再次强调,不要误会我的意思,我很乐意提供帮助(就像这里的大多数人一样);只是我认为,选择这些工具进行日常使用将使您受益匪浅。
只是为了证明这里的人们有多么乐于助人,请考虑下面评论中 @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
或者,就地编辑(例如sed
,perl
也会进行临时备份,所以这不是真的到位编辑):
perl -i.bak -ne 'print if /^report|^-t[ho]/' filename
这将创建原始文件的副本filename.bak
,并用编辑后的版本覆盖原始文件。