echo -e cat:参数行太长

时间:2014-10-08 03:24:30

标签: bash echo cat

我有bash脚本,它会合并一大堆文本文件并对其进行过滤。但是由于庞大的列表,我会遇到“参数行太长”的错误。

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运行单行代码的最佳方法是什么,而不会破坏代码并避免参数行太长的错误。感谢。

2 个答案:

答案 0 :(得分: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(但要注意它的行为不是POSIX指定的,因此在平台或发行版本之间表现不一致):

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

答案 1 :(得分: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