2014-10-17 34 views
-4

清理此unix命令的「最佳」方法是什麼? (例如,一個乾淨的sed命令)將complex tr命令轉換爲sed語句

cat file.txt | tr '\t' '|' | tr '|\n' '|' | tr -s '|' | tr '"' '\n' | sed "/^|/d" 

我的工作流程是類似以下內容:

  1. 更換卡口與管道
  2. 只需管
  3. 擠壓掉重複更換管+新線管子
  4. 用「換行」標記
  5. 刪除每行上的額外

(我用SED更換標籤,新的生產線,等有問題,所以這就是爲什麼我用TR)

+4

一個例子會更好。 – 2014-10-17 09:24:24

+0

顯示你的輸入和期望的輸出會更有幫助。有些方法可以清理你所做的事情,但鑑於你正在試圖做什麼的知識,可能會有一種完全不同的方式去實現它。請更新您的問題。 – 2014-10-17 09:44:20

+0

該過濾器的規格是什麼,即需要轉換或刪除的內容?沒有這個,我們需要從你的(不雅)實現中反向工程! – 2014-10-17 09:45:11

回答

0
sed -n 'H;${s/\t/|/g;s/\|\n/|/g;s/\|{2,\}/|/;s/"/\ 
/g;s/\(\n\)\|\{1,\}/\1/g;s/.//p;}' file.txt 

您的訂單和順序幾乎因改爲可能性,創造新每次修改後都有一個可用的模式

0

這可能爲你工作(GNU SED):

sed 's/\t/|/g;:a;$!N;s/|\n/|/;ta;s/|\+/|/g;s/"/\n/g;s/^|//Mg;P;D' file 

最後的操作是有點曖昧 - 刪除|或刪除行?我選擇刪除|

刪除線使用s/^|.*$//Mg

0

無採樣的輸入和預期的輸出,它只是猜測,但是這可能會做你想要什麼:

awk -v RS='^$' -v ORS= '{ gsub(/\t/,"|"); gsub(/\|\n/,"|"); gsub(/\|+/,"|"); gsub(/"/,"\n"); gsub(/(^|\n)\|/,""); print }' file 

以上使用GNU AWK多焦RS。

當您向我們展示預期的輸入/輸出時,可能會有一個更簡單的awk解決方案,上面只是將您的tr和sed命令翻譯成awk語法,這可能不是慣用的最佳方法。