【问题标题】:sed: Argument list too longsed:参数列表太长
【发布时间】:2012-09-05 18:32:09
【问题描述】:

我在 Unix 环境中创建了一个脚本。在脚本中,我使用了如下所示的sed 命令从文件中删除了一些行。我想从文件中删除一组指定的行,不一定是简单的范围,由行号指定。

sed -i "101d; 102d; ... 4930d;" <file_name>

当我执行它时,它显示以下错误:

sed: Arg is too long

你能帮忙解决这个问题吗?

【问题讨论】:

  • 我已经为您的sed 命令添加了必要的引号;请确认这是您正在使用的命令。您是要删除连续范围的行,还是删除任意行列表? (您显示的命令,假设 ... 的合理替换,不会删除 4930 行;它将删除直到 #4930 的行)。
  • 你能告诉我们确切你想删除哪些行吗?
  • Argument list too long - Unix 的可能重复项
  • @tripleee:这并不是真正的重复。这是一个类似的问题,但解决方案不一定相同。
  • 你从哪里得到行号?如果它们是由不同的命令生成的,请将其直接通过管道传递到 sed,例如:cmd | sed 's/$/d/' | sed -f - file

标签: shell sed


【解决方案1】:

如果要删除连续范围的行,可以指定一个范围的行号:

sed -i '101,4930d' file

如果您想删除一些不能轻易表示为范围的任意行集,您可以将命令放在文件中而不是命令行中,并使用sed -f

例如,如果foo.sed 包含:

2d
4d
6d
8d
10d

然后这个:

sed -i -f foo.sed file

将从file 中删除第 2、4、6、8 和 10 行。将命令放在文件中而不是放在命令行中可以避免对命令行长度的限制。

如果您要删除的行有某种模式,您可以考虑使用更复杂的工具,例如 Awk 或 Perl。

【讨论】:

  • 非常感谢汤普森。我还有一个问题。如果我们通过将行号放在文件中来使用上述命令,那么它也应该给出相同的错误。你能详细说明一下吗?
  • @sumitvedi:首先,我仍然不知道您要做什么。请准确说明您要删除哪些行。您要删除第 1 到 4930 行吗? 101 到 4930?一些任意的线集?其次,不,如果命令在文件中并且您使用sed -f,正如我解释的那样,您不应该得到相同的错误。顺便说一句,在我的系统上,错误消息是“Argument list too long”,而不是“Arg is too long”;请复制并粘贴确切的消息。
  • 是的.. Themson,我有一些任意的行。我要删除的
  • @sumitvedi:(请叫我 Keith。)那么我给你的 sed 解决方案应该可以工作。只需将数字 2、4、6、8、10 替换为要删除的行列表即可。如果行号序列中没有有用的模式,那么使用比 sed 更复杂的东西就没有多大意义了。
【解决方案2】:

我也遇到了同样的问题。

我最初将巨大的 sed 命令 sed -i "101d; 102d; ... 4930d;" &lt;file_name&gt; 放在一个文件中,并尝试作为 bash 脚本执行。

要修复 - 仅将删除命令放在文件中并将该文件作为 sed 脚本运行。我能够执行之前未能运行的 18,193 条删除命令。

sed -i -f to_delete.sed input_file

to_delete.sed:

101d;102d;...4930d

【讨论】:

    【解决方案3】:

    使用 awk:

    awk ' NR < 101 || NR > 4930 { print } ' input_file
    

    【讨论】:

    • 感谢 perreal。但我有一些任意的线。我想按行号从文件中删除。
    【解决方案4】:

    这可能对你有用(GNU sed 和 awk):

    cat <<\! >/tmp/a
    > 2
    > 4
    > 6
    > 8
    > !
    seq 10 >/tmp/b
    sed 's/$/d/' /tmp/a | sed -f - /tmp/b
    1
    3
    5
    7
    9
    10
    awk 'NR==FNR{a[$0];next};FNR in a{next};1' /tmp/{a,b}
    1
    3
    5
    7
    9
    10
    

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 2017-11-30
      • 2020-05-09
      • 2014-05-21
      • 2015-04-04
      • 2021-10-26
      • 2014-04-18
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多