匹配后删除到行尾,保留不匹配的行

Posted

技术标签:

【中文标题】匹配后删除到行尾,保留不匹配的行【英文标题】:Delete to end of line after a match, keep lines not matched 【发布时间】:2013-06-22 05:36:23 【问题描述】:

我有一个格式如下的文件:

interesting text-MIB blah blah blah
VERY INTERESTING TEXT
interesting text-MIB blah blah blah

在包含“-MIB”字符串的每一行中,我想删除该字符串后面的文本,直到行尾。

以下命令似乎按预期工作:

sed -i -n -e 's/-MIB.*$/-MIB/p' ./myfile

我的问题是它还会删除找不到我的模式的行。在这里,“非常有趣的文本”行将被删除。我对 sed 不是很熟悉。我究竟做错了什么? sed适合这种治疗吗?

【问题讨论】:

【参考方案1】:

我已编辑您的sed。试试这个,

sed -i.bak 's/-MIB.*$/-MIB/g' ./myfile

这里,

-i - 将更改原始文件并以 .bak 扩展名备份原始文件

【讨论】:

【参考方案2】:

您需要省略-n 选项。 查看http://www.gnu.org/software/sed/manual/sed.html#index-g_t_002d_002dquiet-7

【讨论】:

【参考方案3】:

sed -n 选项会抑制默认打印,如果您将 p 选项放在 sed 语句之后,则会启用该默认打印。

在上面的示例中,您告诉sed 是禁止打印所有行,然后仅打印那些已成功完成替换的行。因此,不会打印没有进行替换的行。

您需要从命令中删除 -n 选项和 p

sed -ie 's/-MIB.*$/-MIB/' ./myfile

【讨论】:

感谢您的补充说明。

以上是关于匹配后删除到行尾,保留不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

删除文件中与模式不匹配的行

正则表达式删除与第二个字符串匹配的行?

第一章 1.3 保留后N个元素

vim基本用法

sed匹配全行,行首,行尾后替换或添加字符

Linux基础命令