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 に答える