【发布时间】:2011-10-12 21:43:56
【问题描述】:
如何使用 sed 做到这一点?
Input: Expected output:
1 | 1
2 MARKER | 2 MARKER
| 3 MARKER
| 4
|
| 5 MARKER
| 6
|
3 MARKER |
| 7 MARKER
4 | 8
| 9
5 MARKER |
6 |
|
|
7 MARKER |
|
8 |
9 |
首先我尝试了这个:它不起作用,因为“# niether t or b work because d 导致脚本中断。”
/MARKER$/ {
# i -- Line with MARKER
:my_branch
# i -- in branch
# write current patt space to output and read next line to pattern space
n
# if non blank goto EO script
/^$/! b
# if blank line delete it
/^$/ d
# loop back for more blank lines.
t my_branch
# niether t or b work because d causes the script to break.
b my_branch
}
然后我尝试了这个,它几乎可以工作:((( - 它不会删除 3 和 4 之间的线,我认为这是因为在 2 的处理过程中消耗了 3,因此它的标记被遗漏了。
/MARKER$/ {
# i -- Line with MARKER
:my_branch
# i -- in branch
N
s/MARKER\n/MARKER/
t my_branch
# I added the following but it doesn't help..
/MARKER$/ b my_branch
}
我尝试了 4-5 个其他版本,但没有一个有效。
我做这一切是因为我试图回答这个问题:replace two newlines to one in shell command line,所以我从http://sed.sourceforge.net/sed1line.txt和http://www.grymoire.com/Unix/Sed.html开始学习sed
IOW 我知道有使用 awk、perl 等的解决方案,但我只是想学习使用 sed。
谢谢。
【问题讨论】:
-
我不明白您要创建的转换。为什么你的输出中仍然有空白行(只是为了学习?)你能告诉我们你试图实施的规则吗?否则非常好的帖子。感谢您包含您已经阅读并了解的内容!祝你好运。
-
抱歉,这里没有看到推荐。也许您错过了在整个问题中包含标题。 :) 如果您注意到,以“MARKER”结尾的行前面的空白行将被删除。其他空行不宜删除。