2015-12-09 29 views
0

有一個文件創建不正確。文件中有幾個空格分隔的字段,但一個文本字段有一些不需要的換行符。這是一個很大的問題。UNIX替換tr或sed中的字符序列

如何刪除這些字符,但不是想要的行結束?

文件是:

'Number field' 'Text field'     'Number field' 
    1   Some text      999999 
    2   more 
text        111111111 
    3   Even more text     8888888888 
EOF 

因此,有單詞 「更多」 後NL。

我試過SED:

sed 's/.$//g' test.txt > test.out 

sed 's/\n//g' test.txt > test.out 

但所有這些工作。換行符不會被刪除。

tr -d '\n'確實太多了 - 我只需要刪除前面有空格的換行符。

如何刪除空格後面的換行符?

的SunOS 5.10 Generic_144488-09 sun4u的SPARC SUNW,太陽火V440

+0

更好地嘗試並修復源代碼或至少在從源代碼中提取它的過程中。 'tr'在這裏沒有幫助。祝你好運。 – shellter

+1

看起來像一個XY問題。與編寫一些識別好的和壞的換行符的人工智能相比,修復造成破碎的字段的人爲的愚蠢。 – Jens

+0

是的修復是下一個任務。感謝您的幫助 –

回答

2

甲SED溶液是

sed '/ $/{N;s/\n//}' 

說明:

  • / $/:每當線在空間結束,那麼
  • N:追加一個換行符和下一行輸入,然後
  • s/\n//:刪除換行符。
+1

警告:給定的sed命令一次不能連接超過兩條線。例如:'sed'/ $/{N; s/\ n //;}'<<< $'a \ nb \ nc \ n''會產生兩行,而目標可能只產生一行。 (原始問題描述確實會說「一個文本字段有一些不需要的換行符」(複數)。) – peak

+0

早上好,至今爲止我只能看到一條新行。該文件已通過用戶CR從數據庫中提取。我還必須解決在提取中剝離這些CR的問題。這應該是直接的,因爲它是PL/SQL。我知道如何做到這一點。 –

+0

@peak - 很對 - 你需要一個像':;/$/{N; s/\ n //; b}這樣的循環來處理以空格結尾的連續行。 –

0

如何刪除跟隨空格的換行符?

如果你想在原始文件的$' \n'每次出現用空格($' ')來代替,如果你知道一個字符(如控制字符)不會出現在文件中,則任務可以很簡單地使用sed和tr來完成(如你所要求的)。舉個例子,假設control-A是一個不在文件中的字符。爲了簡單起見,我們還假設我們可以使用bash。然後下面的腳本應該做的工作:

#!/bin/bash 
A=$'\01' 
tr '\n' "$A" | sed "s/ $A/ /g" | tr "$A" '\n' 
0

這可能是最簡單的Perl:

perl -p0 -e 's/ \n/ /g' 

-0標誌令Perl讀取整個文件作爲一行。然後我們可以用通常的方式使用s替代。當然,您也可以添加-i選項來就地編輯文件。