I have bash script that would merge a huge list of text files and filter it. However I'll encounter 'argument line too long' error due to the huge list.
echo -e "`cat $dir/*.txt`" | sed '/^$/d' | grep -v "\-\-\-" | sed '/</d' | tr -d \' | tr -d '\\\/<>(){}!?~;.:+`*-_ͱ' | tr -s ' ' | sed 's/^[ \t]*//' | sort -us -o $output
I have seen some similar answers here and i know i could rectify it using find and cat the files 1st. However, i would i like to know what is the best way to run a one liner code using echo -e and cat without breaking the code and to avoid the argument line too long error. Thanks.
First, with respect to the most immediate problem: Using find ... -exec cat -- {} +
or find ... -print0 | xargs -0 cat --
will prevent more arguments from being put on the command line to cat
than it can handle.
The more portable (POSIX-specified) alternative to echo -e
is printf '%b\n'
; this is available even in configurations of bash where echo -e
prints -e
on output (as when the xpg_echo
and posix
flags are set).
However, if you use read
without the -r
argument, the backslashes in your input string are removed, so neither echo -e
nor printf %b
will be able to process them later.
Fixing this can look like:
while IFS= read -r line; do
printf '%b\n' "$line"
done \
< <(find "$dir" -name '*.txt' -exec cat -- '{}' +) \
| sed [...]