回答:
sed コマンドラインで入力される(またはシェルスクリプトに埋め込まれる)スクリプトは、シェルで許可される最大コマンドライン長までの任意の長さにすることができます-最新のシェルではメガバイト長です。
また、スクリプトで複数のことを実行する場合は、複数回使用する必要はありません。複数のコマンドを改行またはセミコロンで区切ることができます。-esed
たとえば、次の代わりに:
sed -e 's/foo/bar/' -e 's/abc/def/'
できるよ:
sed -e 's/foo/bar/; s/abc/def/'
または:
sed -e 's/foo/bar
s/abc/def'
shと同様に、ステートメント間の追加の空白は重要ではありません。;上記の最初の例の後にスペースを使用し、2番目の例ではインデントにスペースを使用して読みやすくしました。
一部のsedコマンドは、改行ではなく、改行でのみ終了することに注意してください;。これらは;、改行とともに、sedコマンドの区切り文字である一般規則に対する十分に文書化された例外です。詳細については、https://www.gnu.org/software/sed/manual/html_node/Multiple-commands-syntax.htmlを参照してください(このドキュメントは、すべての/ほとんどのバージョンに適していますsed-GNUの非標準の拡張機能については言及されている場合に注意してください)。
たとえば、特定の文字列の直後に数行のテキストを追加する場合、a(追加)コマンドはsed改行でのみ終了できるコマンドの1つです。
/search-string-here/ a\
text line 1 ; semicolons are just text\
text line 2 ; and more text here\
<more sed commands can go here>
sedスクリプトは、スクリプトをファイルに入れ、各コマンドをa または改行(または両方)で区切る限り、任意の長さにすることができます。例えば、それらを実行します:sedsed;
sed -f scriptfilename ...
sed他のスクリプト言語の場合と同様に、スタンドアロンスクリプトを作成できます。chmod +xあなたが#!/bin/sed -f最初の行として持っている場合、それらは実行可能にすることさえできます。
例えば:
#!/bin/sed -f
s/foo/bar/
s/abc/def/
sed単なる「コマンド」ではなく、スクリプト言語です。ほとんどの人は、パイプラインでいくつかの小さくて単純な正規表現の置換のためにそれを使用しますが、sedそれ以上の機能があります。
詳細man sedを参照してください。GNU sedには、Texinfo形式の完全なドキュメントも付属しています。info sedそれを読むために実行します(またはpinfo sed、pinfoビューアがインストールされている場合-それははるかに優れていますinfo)。同じドキュメントはhttps://www.gnu.org/software/sed/manual/でもさまざまな形式で入手できます。
sedコマンドで機能しますが、コマンドの一部には改行しか続かないため、 sedコマンドのセパレータとして使用できるわけではありません。
;のsedコマンドでの区切りであるを除いて、すべてのものの例外のための十分な理由を持っているいくつかのよく文書化された例外のために。たとえばa、追加、c変更、およびi挿入用。(エスケープされていない)改行までテキストを挿入、変更、または追加します。挿入されるテキストなどのセミコロンは、テキストの一部にすぎません。また、ファイルから読み取りまたは書き込みを行うコマンド、またはシェルコマンドを実行するコマンド(;sh自体によって使用され、ファイル名、引用符付き文字列などで有効な文字であるため)。これらはすべて、セミコロンではなく改行で終了します。
コマンドラインの最大長まで。コマンドラインの長さの制限は、シェルによってではなく、オペレーティングシステムによって課されます。通常、この制限は100キロバイトの範囲です。POSIXは、この制限ARG_MAXを示し、POSIX準拠システムでは、次を使用して照会できます。
$ getconf ARG_MAX # Get argument limit in bytes
でテストする:
$ sed $(printf ' -e s/%s//g' $(seq 0001000000)) file
2097152、それは2Gを超えることを意味します。編集された質問を参照してください。