2014-09-12 121 views
1

我想做一個腳本來刪除這個字符(/ r/n),Windows放置。但只有當他們是這個(「)之間,爲什麼呢?因爲 轉儲文件放在這個角色,我不知道爲什麼。 爲什麼引號之間?因爲它不僅會影響我,如果他們拿刀砍我的結果用bash腳本刪除行尾字符?

For Example. "this","is","a","result","from","database" 

問題:

"this","is","a","result","from","da 
tabase" 

[編輯]

由於@Cyrus的答案,我得到了這樣的事情enter image description here

,但它在替換命令'}'中得到壞標記我在MAC OSX上

你能幫我嗎?

感謝

+0

你是指*行*字符的結尾?而那些在Linux等POSIX系統上只有一個''\ n''。 – 2014-09-12 17:53:41

+0

@JoachimPileborg是的,我知道這些字符是什麼,但我不知道如何刪除它們, - 對於上下文 - 當我試圖將進度轉儲文件導出到Oracle時,它與eol字符有衝突正在削減我的結果,這就是爲什麼我想要刪除它們。感謝您的更正(Y) – jompi 2014-09-12 17:57:33

+0

Mac OSX?請修復您的標籤。 – Cyrus 2014-09-12 18:56:01

回答

2

OS X採用的是不同的sed比的是通常安裝在Linux中的一個。

最大的區別是像\r\n這樣的序列不會像您期望的那樣被擴展或用作表達式的一部分,而且您傾向於需要使用分號分隔多個命令。

如果你可以用一個sed一行代碼實現的規則一樣獲得通過「刪除含有報價行的任何\r\n」,它肯定會簡化你的任務......

對於我的實驗,我用什麼我推斷是您的樣本輸入數據:

$ od -c input.txt 
0000000 F o r  E x a m p l e .  " t h 
0000020 i s " , " i s " , " a " , " r e 
0000040 s u l t " , " f r o m " , " d a 
0000060 t a \r \n b a s e " \n       
0000072 

首先,一個殼唯一的解決辦法可能是使用內置於操作系統的小工具。例如,這裏是一個班輪:

od -A n -t o1 -v input.txt | rs 0 1 | while read n; do [ $n -eq 015 ] && read n && continue; printf "\\$n"; done 

爆發更容易閱讀,這裏是這個樣子:

  • od -A n -t o1 -v input.txt | rs 0 1 - 將文件轉換爲OCAL數字
  • | while read n; do流 - 逐步通過號碼...
    • [ $n -eq 015 ] && - 如果當前數字是15(即回車的八進制數)
    • read n - 讀取一行(因此跳過它),
    • && continue - 和繼續到下一個八進制數(因而跳過CR之後的換行符)
    • printf "\\$n"; done - 打印當前的八進制數。

這種數據轉換和流邏輯很好地工作在流水線,但它是一個有點難以實現SED,只知道如何處理與原來的輸入,而不是它的轉化形式。

另一個bash的選擇可能是使用條件表達式匹配輸入的原線路:

while read line; do 
    if [[ $line =~ .*\".*$'\r'$ ]]; then 
    echo -n "${line:0:$((${#line}-1))}" 
    else 
    echo "$line" 
    fi 
done < input.txt 

這遍歷文本,如果它看到了CR,它打印的一切行動並沒有包括它與沒有尾隨換行符。對於所有其他行,它只是照常打印它們。結果是具有回車符的行被連接,其他行不連接。

從sed的角度來看,我們正在處理兩條輸入行,其中第一行以回車符結束。爲此的策略將搜索回車,刪除它們並加入線路。我努力嘗試想出一些能做到這一點的東西,然後放棄了。不是說這是不可能的,但我懷疑通常有用的腳本會很長(通過sed標準)。

+0

令人驚歎!並很好地解釋!我從中學到了很多東西,非常感謝ghoti – jompi 2014-09-12 21:22:49

+0

如何刪除回車?我的意思是我做了你所說的話,並把它放在>> newtext.txt中,它像一個魅力一樣工作,但真正的文件是關於10Gb,並且執行'>> newtext.txt'會很糟糕,我想和你的第一個班輪你打印的例子,你能幫我從文件中刪除CR嗎? – jompi 2014-09-12 21:33:58

+0

@jompi,在第一個選項中,數據通過管道移動。第二,我們使用輸入重定向。所以這兩種方法都不應該有10GB(或任何大小)文件的問題。管道和重定向很好,因爲它們不需要「加載文件到內存」來處理它,它們只處理* stream *(或它的一個小緩衝區)。 – ghoti 2014-09-15 14:09:55