Unix環境でスクリプトを作成しました。スクリプトでは、sed
以下に示すコマンドを使用して、ファイルからいくつかの行を削除しました。行番号で指定されたファイルから、必ずしも単純な範囲ではなく、指定された一連の行を削除したいと考えています。
sed -i "101d; 102d; ... 4930d;" <file_name>
これを実行すると、次のエラーが表示されます。
sed: Arg is too long
この問題を解決するのを手伝ってもらえますか?
連続する行の範囲を削除する場合は、行番号の範囲を指定できます。
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 などのより高度なツールの使用を検討してください。
私はこれとまったく同じ問題を抱えていました。
もともと巨大な 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
これはうまくいくかもしれません (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
awk を使用:
awk ' NR < 101 || NR > 4930 { print } ' input_file