2017-08-13 75 views
0
一起刪除換行符

我有這些詞之間標籤(5個):的換行符替換選項卡,並與SED

cat dog

,我想這樣的輸出:

cat 
dog

我嘗試這樣做:sed 's/\t/\n/g; /^$/d' pets 並且輸出與sed 's/\t/\n/g' pets相同:

cat 




dog

我不得不執行兩次sed才能得到我想要的。像這樣sed 's/\t/\n/g' pets>tempsed '/^$/d' temp

有沒有辦法用一個命令獲得所需的輸出?

+0

'sed's/[\ t] [\ t] */\ n/g''?你可以刪除*字符類*符號(例如'['和']',但是它們表明你正在處理字符,這取決於你。'sed's/\ t \ t */\ n/g ''是等效的。 –

+0

'xargs -n1'也可能適用,所有非空格字符序列將顯示在不同的行上 – Sundeep

回答

2

繼續我的評論。 sed 's/\t/\n/g的問題是您將用'\n'替換每個'\t'。您想要將製表符的序列替換爲單個換行符。爲此你需要:

sed 's/\t\t*/\n/g' 

,或者如果你喜歡明確封閉'\t'[ ]這很好,以及。

表達'\t'匹配單個選項卡,然後當由'\t\t*'它相匹配的標籤和零個或多個標籤,遵循與單個'\n'替換序列,產生所需輸出:

cat 
dog 

g(全局)最後只會用一個換行符替換每個序列,例如

"cat  dog   fish" 

(由製表符分隔),成爲

cat 
dog 
fish 

讓我知道如果您有任何問題。

1

如果標籤的數量是重要的,BRE將讓你通過轉義花括號,像這樣指定範圍:

$ sed $'s/\t\{5\}/\\\n/' <<<$'one\t\t\t\t\ttwo' 
one 
two 

注意,所以它是未知的,你還沒有指定的操作系統是否你」重新使用GNU sed,這會讓你在你的正則表達式中包含諸如\t之類的東西。 (我使用FreeBSD和macOS,其中sed沒有這個功能。)但是你提到你正在使用bash,它支持"format expansion"。您可以使用此bash功能將「文字」特殊字符插入腳本中。