2014-10-08 19 views
0

我有bash腳本會合並大量的文本文件並對其進行過濾。不過,由於巨大的列表,我會遇到'參數線太長'的錯誤。echo -e cat:參數行太長

echo -e "`cat $dir/*.txt`" | sed '/^$/d' | grep -v "\-\-\-" | sed '/</d' | tr -d \' | tr -d '\\\/<>(){}!?~;.:+`*-_ͱ' | tr -s ' ' | sed 's/^[ \t]*//' | sort -us -o $output 

我在這裏看到了一些類似的答案,我知道我可以使用find和cat來修正它。但是,我想知道什麼是使用echo -e和cat運行單行代碼的最佳方式,而不會破壞代碼並避免參數行太長的錯誤。謝謝。

+1

是否有您使用'echo -e'的原因?你是否真的想將文本文件中的轉義序列改變成它們所代表的字符? – 2014-10-08 03:35:26

+1

通常,避免argument-list-too-long錯誤的正確方法是使用一個命令,該命令在參數不適合所有參數時運行多個命令。 'find「$ dir」-name「* .txt'-exec cat'{}'+'是一個典型的例子。 – 2014-10-08 03:38:27

+0

是我需要改變轉義序列。 ;( – 2014-10-08 03:57:07

回答

2

echo -e沒有必要擴大大多數反斜槓轉義序列 - \n,\t,其他許多實際上將由read本身進行處理,除非給出可選的-r標誌。 (這就是爲什麼人們應該養成使用read -r的習慣,否則就沒有一個特定的和有說服力的理由)。

如果所有你關心的序列是那些read將擴大本身,那麼這將是足夠的:

while IFS= read; do 
    printf '%s\n' "$REPLY" 
done \ 
    < <(find "$dir" -name '*.txt' -exec cat '{}' +) \ 
    | sed [...] 

如果沒有,那麼你就可以回落到echo -e(但被警告其行爲ISN POSIX指定的,因此可能在平臺或發行版本之間表現不一致):

while IFS= read -r; do 
    echo -e "$REPLY" 
done \ 
    < <(find "$dir" -name '*.txt' -exec cat '{}' +) \ 
    | sed [...] 
1
grep -v '^$' $dir/*.txt | grep -v "\-\-\-" | sed '/</d' | tr -d \' \ 
    | tr -d '\\\/<>(){}!?~;.:+`*-_ͱ' | tr -s ' ' | sed 's/^[ \t]*//' \ 
    | sort -us -o $output 

如果你想想看一些你也許可以擺脫很多更多的東西,並把它變成一個單一的sedsort,大致爲:

sed -e '/^$/d' -e '/\-\-\-/d' -e '/</d' -e 's/\'\\\/<>(){}!?~;.:+`*-_ͱ//g' \ 
    -e 's///g' -e 's/^[ \t]*//' $dir/*.txt | sort -us -o $output 
+0

謝謝。這有幫助,但我將如何包括ehco -e解釋反斜槓轉義或有更好的解決方案?對不起,我還在學習。 – 2014-10-08 03:40:36