想象一下下面的示例输入文件:
(1) Lorem ipsum dolor sit amet
vero eos et accusam et justo duo
(2) Lorem ipsum dolor sit amet
vero eos et accusam et justo duo
(3) Lorem ipsum -- dolor sit amet
vero eos et accusam et justo duo
(4) Lorem -- ipsum dolor sit amet
vero eos et accusam et justo duo
我有兴趣查找脚本中所有以关键字amet
结尾并且不包含关键字--
的行。如果找到这样的行,则如果后继行为空,则应将其删除。因此,仅第二(2)个示例必须更改:
(1) Lorem ipsum dolor sit amet
vero eos et accusam et justo duo
(2) Lorem ipsum dolor sit amet
vero eos et accusam et justo duo
(3) Lorem ipsum -- dolor sit amet
vero eos et accusam et justo duo
(4) Lorem -- ipsum dolor sit amet
vero eos et accusam et justo duo
答案 0 :(得分:2)
此sed命令将起作用:
sed '/--/b;/amet$/{N;s/\n$//;}'
它执行以下操作:
/--/b # If line matches "--", skip all commands
/amet$/ { # If the line ends in "amet"
N # Read next line into pattern space
s/\n$// # Delete the second line if it is blank
}
在少数情况下会失败:以blamet
结尾的行是否合格? --
是否必须用空格分隔?可能会有这样的输入:
ends in amet
also ends in amet
next line
,因为提出的解决方案不会删除此处的空白行。不过,对于显示的输入,它将起作用。
答案 1 :(得分:2)
让我们一点一点地创建它:
仅处理以amet
结尾的行(使用GNU \b
匹配单词边界):
/\bamet$/
如果其中不包含--
/--/!
然后打印该行
n
如果下一行为空,请将其删除
/^$/d
这给出了一个简单的程序:
#!/bin/sed -f
# Process only lines that end with `amet`:
/\bamet$/{
# If it doesn't contain `--`
/--/!{
# Then print the line
n
# And if the next line is empty, delete it
/^$/d
}
}