2016-03-04 28 views
0

我對unix完全陌生,我試圖弄清楚如何從文件目錄中刪除包含部分字符串的行。我已經設法從我讀過的內容中拼出一段腳本,但問題是它合併了行並且不保留回車符。Unix Bash防止sed合併行?

命令:

grep -l "apple" tmp/* -R | xargs -I'{}' sed -i '/apple/d' '{}' 

文件:

1.txt 
applepie 
green 
blue 

2.txt 
applepie 
green 
blue 

輸出:

1.txt 
greenblue 

2.txt 
greenblue 

w ^爲了保持綠色和藍色作爲單獨的線條,我需要改變帽子嗎?

注意:我不確定它是否有所作爲,但我在Windows上使用cygwin。

+0

如果MSWIndows與1.txt和2.txt有關,則使用'dos2unix * .txt'。祝你好運。 – shellter

+0

@shellter我不明白dos2unix合併行嗎?我需要保持它們分開 – nickyb

回答

1

你的問題不在於這些命令。你問題中的命令和文件是正確的,並且產生你想要的輸出。

您描述的問題是Unix類系統和基於Windows的系統之間行結尾處理方式的特點。發生這種情況可能是因爲您使用了基於Windows的工具來創建這些文件,這些文件給了它們Windows風格的行尾,而Cygwin環境中的工具需要像Unix一樣的行尾。幸運的是,您可以使用一個方便的命令將文件中的所有行尾轉換爲適當的類型 - 它被稱爲dos2unix

dos2unix將文件中的所有行結尾轉換爲Unix/Linux類型。 (而且,如果他們已經這樣,那麼運行它並不會受到傷害。)您可以使用這樣的:

dos2unix *.txt 

完成該操作後,該文件將具有正確行尾,和你原來的命令,就可以(但阿里夫·布爾汗是正確的 - 你可以做的只是用sed -i '/apple/d' *.txt同樣的事情)

如果你喜歡Cygwin,可以試試這個叫做babun的東西 - 它是Cygwin,但是有一些幕後設置使得它更容易和更有趣。

快樂黑客!

0

你只需要:

sed -i '/apple/d' textfile.txt 

除非你想輸出去到另一個文件,當你在末尾添加

> newfile.txt 

+0

** sed -i'/ apple/d'tmp/***將輸出到控制檯,同樣會** cat tmp/* | sed -i'/ apple/d'** –

+0

上述兩個工作都在** tmp/**目錄中的每個文件上。 –

+0

我需要它來檢查目錄中的所有文件。我試過'sed -i'/ apple/d'tmp/*',但仍然有相同的輸出。我需要保持線條分離。 – nickyb

2

正如在評論中指出的,這可能是由於如何處理新行。您可以使用cat -A打印控制字符;如果你的文件是這樣的:

$ cat -A 1.txt 
applepie^M$ 
green^M$ 
blue^M$ 

那麼你可能有回車+換行符作爲換行符(DOS/Windows風格)。或在一個hexdump都:

$ od -w10 -t az --endian=big -x 1.txt 
0000000 a p p l e p i e cr nl >applepie..< 
      6170 706c 6570 6965 0d0a 
0000012 g r e e n cr nl b l u >green..blu< 
      6772 6565 6e0d 0a62 6c75 
0000024 e cr nl        >e..< 
      650d 0a00 
0000027 

,其中可疑0d0acr nl告訴你同樣的故事。

要解決這個問題:

 
$ dos2unix 1.txt 
$ cat -A 1.txt 
applepie$ 
green$ 
blue$ 
$ r$ od -w10 -t az --endian=big -x 1.txt 
0000000 a p p l e p i e nl g >applepie.g< 
      6170 706c 6570 6965 0a67 
0000012 r e e n nl b l u e nl >reen.blue.< 
      7265 656e 0a62 6c75 650a 
0000024 

只有nl0a)爲換行符– sed的應該沒問題用換行了。