sed:参数列表太长了

时间:2012-09-05 18:32:10

标签: shell sed

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

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

当我执行此操作时,它会显示以下错误:

sed: Arg is too long

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

4 个答案:

答案 0 :(得分:5)

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

sed -i '101,4930d' file

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

例如,如果foo.sed包含:

2d
4d
6d
8d
10d

然后这个:

sed -i -f foo.sed file

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

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

答案 1 :(得分:1)

我有同样的问题。

我最初将巨型sed命令sed -i "101d; 102d; ... 4930d;" <file_name>放在一个文件中,并尝试以bash脚本的形式执行。

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

sed -i -f to_delete.sed input_file

to_delete.sed:

101d;102d;...4930d

答案 2 :(得分:0)

使用awk:

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

答案 3 :(得分:0)

这可能适合你(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