【发布时间】:2015-09-23 20:37:28
【问题描述】:
假设我想删除模式之后的一些行,同时跳过中间的一些行,然后删除模式本身的行。我可以使用以下两个命令来做到这一点:
sed -i '/PATTERN/{n;n;n;n;n;n;N;N;N;N;d}' file # match pattern, skip 5 lines, then delete 5 consecutive lines
sed -i /PATTERN/d file # delete line with pattern
但我想在一个命令中执行此操作。这里的问题很明显,因为模式更改会影响两个表达式,因此必须在单个表达式中指定更改。有没有办法做到这一点?
更新:
示例输入:
...
ifeq ($(ose),)
dh_installdocs \
$(archdir)/UserManual*.pdf $(archdir)/VirtualBox*.chm \
$(addprefix $(archdir)/, LICENSE)
rm $(addprefix $(archdir)/,UserManual*.pdf VirtualBox*.chm \
LICENSE)
else
dh_installdocs \
$(archdir)/UserManual*.pdf
rm $(addprefix $(archdir)/,UserManual*.pdf)
endif
...
示例输出:
...
dh_installdocs \
$(archdir)/UserManual*.pdf $(archdir)/VirtualBox*.chm \
$(addprefix $(archdir)/, LICENSE)
rm $(addprefix $(archdir)/,UserManual*.pdf VirtualBox*.chm \
LICENSE)
...
更新 2:
示例文件可以在这里获取:http://download.virtualbox.org/virtualbox/5.0.4/VirtualBox-5.0.4.tar.bz2(debian/rules)
【问题讨论】:
-
必须是
sed和一个命令吗?你能给出一个测试输入和输出的例子吗?但首先想到的是 - 如果您正在使用相同的模式进行键控,这是否意味着您正在删除然后跳过? -
是的,它必须是单行命令,最好是 sed。如果 sed 不是一个选项,那么也许其他人会这样做(我没有在 sed 之外寻找答案)。我将用一个例子来更新最初的帖子。
-
为什么我的问题被否决了?
-
在
{之后建议使用x;之前有一个答案。这部分起作用,因为它从具有匹配模式的行中删除所有内容,同时留下一个空白行。有没有办法去掉整行? -
请告诉我我的问题出了什么问题,以便我解决。在发布之前,我总是尝试正确地提出我的问题。