我在Unix环境下创建了一个脚本。在脚本中,我使用sed
命令,如下所示从文件中删除一些行。我想从行号中指定的文件中删除一组指定的行,不一定是简单的行。
sed -i "101d; 102d; ... 4930d;" <file_name>
当我执行此操作时,它会显示以下错误:
sed: Arg is too long
您能帮忙解决这个问题吗?
答案 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