【问题标题】:echo -e cat: argument line too longecho -e cat:参数行太长
【发布时间】:2014-10-08 03:24:29
【问题描述】:

我有一个 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 the files 1st 来纠正它。但是,我想知道在不破坏代码的情况下使用 echo -e 和 cat 运行单行代码的最佳方法是什么,并避免参数行太长错误。谢谢。

【问题讨论】:

  • 您使用echo -e 有什么原因吗?您真的想将文本文件中的转义序列更改为它们所代表的字符吗?
  • 一般来说,避免参数列表太长错误的正确方法是使用一个命令,该命令在参数不适合一个时运行多个命令。 find "$dir" -name '*.txt' -exec cat '{}' +就是一个典型的例子。
  • 是的,我需要更改转义序列。 ;(

标签: bash echo cat


【解决方案1】:

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 [...]

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 谢谢。这有帮助,但我将如何包含 ehco -e 来解释反斜杠转义,还是有更好的解决方案?抱歉,我还在学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多