如何使用 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或b work,因为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,因此错过了它的标记。 / p>
/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我知道有使用awk,perl等的解决方案,但我只是想学习使用sed。
感谢。
答案 0 :(得分:1)
见下文,我认为这是你想要的:(它在我的linux盒子上用gnu sed运行)
kent$ cat t
1
2 MARKER
3 MARKER
4
5 MARKER
6
7 MARKER
8
9
kent$ sed -r ':a;N;s/(.*MARKER)\s+(\n.*)/\1\2/;ba;' t
1
2 MARKER
3 MARKER
4
5 MARKER
6
7 MARKER
8
9