我有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运行单行代码的最佳方法是什么,而不会破坏代码并避免参数行太长的错误。感谢。
答案 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
如果你再考虑一下,你可以把更多东西丢掉,把它变成一个sed
和sort
,粗略地说:
sed -e '/^$/d' -e '/\-\-\-/d' -e '/</d' -e 's/\'\\\/<>(){}!?~;.:+`*-_ͱ//g' \
-e 's/ / /g' -e 's/^[ \t]*//' $dir/*.txt | sort -us -o $output