2011-12-15 80 views
7

我想刪除所有在分區字符串後出現的換行符,並將其替換爲製表符空格。例如說我sample.txt的是如下通過bash/awk/sed/perl刪除特定文本後的新行

foo 
bar bar bar bar some text 

我想它是

foo bar bar bar bar some text 

如何通過的bash/awk的/ SED做到這一點。幫助。

+0

「某些文字」發生了什麼? – 2011-12-15 11:51:43

+0

只是錯過了,我猜沒有什麼區別。 所以期望的輸出應該是 foo酒吧酒吧酒吧一些文字 – Greenhorn 2011-12-15 11:56:28

回答

11

在awk中:

awk '/foo$/ { printf("%s\t", $0); next } 1' 
2

並非所有工具都可以進行換行替換。 Perl可以:

cat file.txt | perl -p -e 's/\n/ /g' 
+3

mmm 1.你錯過了'foo'的要求。 2.你錯過了_tab_要求 – sehe 2011-12-15 11:48:48

2

嗯。不知道這符合你的要求,但我會做到這一點在vim:

:g/^foo$/join 

或者,如果FOO可以在任何地方行:

:g/foo$/join 

當然,:%s/foo\n/foo\t/g會做很好地太

+0

也嘗試過這個!工作:) – Greenhorn 2011-12-15 12:11:09

1

這可能會爲你工作:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}' 
foo  bar bar bar bar some text 

其實:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/' 
foo  bar bar bar bar some text 

的後者的解決方案效率較低,但不是太大!

1
perl -pe 's/foo\n/foo\t/g' temp2.txt 

以下是測試。

243> cat temp2.txt 
foo 
bar bar bar bar some text 
pearl[[email protected]].244> perl -pe 's/foo\n/foo\t/g' temp2.txt 
foo  bar bar bar bar some text 
0

sed版本看起來像

#!/bin/sed -f 
/foo/{ 
N 
s/\n/\t/ 
} 

如果這是你想要在你的sed命令來執行,可以簡化上面一行代碼:

sed -e '/foo/N;y/\n/\t/' <sample.txt 

說明:N附加一個換行符和下一行輸入; y/\n/\t用標籤替換所有換行符,或s/\n/\t/用標籤替換第一個換行符。

請注意,因爲sed是面向行的,所以輸入中的換行符被認爲是行分隔符而不是任何行的一部分(這與Perl相反)。