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標準)。
你是指*行*字符的結尾?而那些在Linux等POSIX系統上只有一個''\ n''。 – 2014-09-12 17:53:41
@JoachimPileborg是的,我知道這些字符是什麼,但我不知道如何刪除它們, - 對於上下文 - 當我試圖將進度轉儲文件導出到Oracle時,它與eol字符有衝突正在削減我的結果,這就是爲什麼我想要刪除它們。感謝您的更正(Y) – jompi 2014-09-12 17:57:33
Mac OSX?請修復您的標籤。 – Cyrus 2014-09-12 18:56:01