2016-04-22 65 views
2

它總是讓我感到困惑的是sed沒有j命令,就像ed一樣。希望sed擁有ed的便捷j命令的等價物

This question問如何加入一般的線,並有一堆很好的答案,許多特色的其他工具,如awkperl。並且也有一些sed解決方案,但它們都涉及使用s命令來逐字編輯換行符,這是一種解決方案,由於各種原因,我覺得這種解決方法讓我覺得很糟糕。

現在,sed也有一些模糊的命令與「hold」和「pattern」空間有關,我從來沒有想過如何使用它。我一直認爲 - BICBW - 如果我能弄清楚如何使用它,那麼保留空間就是sed對j命令的回答。

所以我今天的問題 - 這是一個知識分子作爲一個實際的問題一樣多 - 是,是否有一個良好的,安全的,合理簡潔的方式做的

sed /pat/j 

相當於這對於包含模式pat的每一行,請將其加入到以下行(即,如果我使用g/pat/j/,則將ed)。

正如我所說,這是一個智力問題。我知道如何使用其他工具連接線,或者在帶引號的換行符上使用seds命令。但在我看來,應該有更好的辦法。

(或者,也許我應該只是SNARF的sed.c副本,並在適當的j命令破解。)

回答

3
sed '/pat/{$!{N;s/\n/ /}}' 

如果pat比賽和線不是最後一行,添加以下行至該行,然後用空格替換\n

編號:how-can-i-use-sed-to-replace-a-multi-line-string

+0

啊哈!所以,如果我正確地理解了這一點,'N'幾乎就像'j',除了它插入一個換行符。很有意思。(你的例子並不直接爲我工作;我不得不使用'sed -e'/ pat/N'-e's/\ n//''。你的例子不斷抱怨「替換命令中的壞標誌:'} ''。不知道這是我的sed版本還是什麼限制。) –

+0

它使用不可移植的構造,因此不同seds中的行爲會有所不同。所以你的評論中的解決方案也會在不同的seds中表現不同。 –

+0

@SteveSummit他在使用GNU'sed',每個命令後都不需要換行符。方便「單線」。 – Kusalananda

1

我知道這很難下嚥,但老實說 - sed的是個別線路和anyt簡單的換人否則你應該使用awk。我發現sed非常有用,並且幾乎每天都會使用它30多年,但是在70年代中期awk被髮明時,所有的sed構造除了個別行上的簡單替換之外都沒有做過任何事情。

$ seq 4 | awk '{printf "%s%s", s, $0; s=ORS} /2/{s=OFS} END{print ""}' 
1 
2 3 
4 

如何通過2S連接線:

$ seq 10 | awk '{printf "%s%s", $0, (NR%2?OFS:ORS)}' 
1 2 
3 4 
5 6 
7 8 
9 10 

嘗試修改的sed腳本加入兩行加入5線代替。相較於換號2到數5簡單,明顯AWK的調整:

$ seq 10 | awk '{printf "%s%s", $0, (NR%5?OFS:ORS)}' 
1 2 3 4 5 
6 7 8 9 10 

以上將在所有的操作系​​統都awks工作,很容易用最小的變化增強,如果/當你的需求改變 - 雙非常重要的原因,爲什麼你應該學習使用awk而不是sed。

+0

謝謝,埃德,我知道所有關於awk,每天都在使用它,但那不是我問的。 –

+0

@SteveSummit @SteveSummit瞭解,但這個問題和它得到的答案將在這裏多年來,許多人閱讀,所以恕我直言,重要的是,這個答案是爲他們的緣故,如果不是爲你的。 –