Delete to end of line after a match, keep lines not matched

隐身守侯 提交于 2019-12-08 16:25:40

问题


I have a file of the following form:

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

In each line containing the "-MIB" string, I would like to delete the text following this string, until the end of the line.

The following command seems to work as intended:

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

My problem is that it also deletes the lines where my pattern is not found. Here, the line "VERY INTERESTING TEXT" would be deleted. I am not really familiar with sed. What am i doing wrong? Is sed appropriate for this kind of treatment?


回答1:


You need to leave out the -n option. Check out http://www.gnu.org/software/sed/manual/sed.html#index-g_t_002d_002dquiet-7




回答2:


I have edited your sed. Try this,

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

Here,

-i - will do the changes in original file and takes the backup of original file in .bak extension




回答3:


sed -n option suppresses the default printing which is later enabled if you put p option after your sed statement.

In your example above, what you are telling sed is to suppress printing of all lines and then print only those lines where substitution has been done successfully. As a result the line where no substitution is made is never printed.

You need remove the -n option and p from your command:

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


来源:https://stackoverflow.com/questions/17297054/delete-to-end-of-line-after-a-match-keep-lines-not-matched

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!