我有一个包含如下数据的文件:
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
.. --.
问题:我想删除任何不以以下字符串开头的行:
report
-th
-to
这意味着所需的输出将删除所有那些中间不需要的点和哈希,并且将如下所示:
report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc
sed
/ awk
/ grep
/等任何解决方案,将工作。
我有一个包含如下数据的文件:
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
.. --.
问题:我想删除任何不以以下字符串开头的行:
report
-th
-to
这意味着所需的输出将删除所有那些中间不需要的点和哈希,并且将如下所示:
report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc
sed
/ awk
/ grep
/等任何解决方案,将工作。
Answers:
使用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的建议,随时可以在此聊天室提问。
您可以为此使用简单的grep:
$ grep -e '^report\|^-th\|^-to' filename
-th
/ 组合-to
到中-t[ho]
。
grep -e
或egrep
发问者指出两点:
目前,解决方案着眼于第一点,因此也针对第二点。但是,假设文件较大,如下所示:
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
- -----
是否需要解决OP的第二点?
sed -r -i.bak '/^[ |.|-]*$/d' input-file
会执行以下操作:删除可能仅包含空格,点和破折号的多余线条,并保留其余部分,不管是什么。
我认为这两种方法的风险都是文件的性质定义不正确。