6

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

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

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

sed: Arg is too long

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

4

4 回答 4

5

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

sed -i '101,4930d' file

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

例如,如果foo.sed包含:

2d
4d
6d
8d
10d

那么这个:

sed -i -f foo.sed file

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

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

于 2012-09-05T18:42:13.537 回答
3

我有这个完全相同的问题。

我最初将巨大的 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

于 2018-02-08T19:43:09.253 回答
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
于 2012-09-05T20:56:25.823 回答
0

使用 awk:

awk ' NR < 101 || NR > 4930 { print } ' input_file
于 2012-09-05T19:29:19.600 回答