Как мне это сделать, используя 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 работают, потому что 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, что, я думаю, связано с тем, что 3 используется во время обработки 2 и, таким образом, его маркер пропущен.
/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 других версий, которые я пробовал, но ни одна не работала.
Я сделал все это, потому что пытался ответить на этот вопрос: заменил две новые строки на одну в командной строке оболочки , поэтому я начал изучать sed с http://sed.sourceforge.net/sed1line.txt и http://www.grymoire.com/Unix/Sed.html
Я знаю, что есть решения, использующие awk, perl и т. Д., Но я просто хотел научиться использовать sed.
Спасибо.