1つのsedコマンドにいくつの式を追加できますか?[閉まっている]


0

sed -e 'expression1' -e 'expression2' inputfile うまくいきます。

私の作品ではsed、シェルスクリプト内のコマンドに多くの式を追加します。ただし、表現は2つの異なる色に分けられます。

ここに画像の説明を入力してくださいsedそれsedを処理できるように 、1つのコマンドにいくつの式を追加できますか?


POSIX標準による制限はありません。しかし、execve()に渡す引数の制限であるため、引数リストが長すぎるエラーに直面する可能性があります
— -cuonglm

6
色の変更は、コマンドラインの長さではなく、ターミナルアプリケーションに関係する可能性が最も高いです。
— ティガー


どっち?どのエディターですか?
— ムル

回答:


6
  1. 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>
    
  2. sedスクリプトは、スクリプトをファイルに入れ、各コマンドをa または改行(または両方)で区切る限り、任意の長さにすることができます。例えば、それらを実行します:sedsed;

    sed -f scriptfilename ...
    

    sed他のスクリプト言語の場合と同様に、スタンドアロンスクリプトを作成できます。chmod +xあなたが#!/bin/sed -f最初の行として持っている場合、それらは実行可能にすることさえできます。

    例えば:

    #!/bin/sed -f
    
    s/foo/bar/
    s/abc/def/
    
  3. sed単なる「コマンド」ではなく、スクリプト言語です。ほとんどの人は、パイプラインでいくつかの小さくて単純な正規表現の置換のためにそれを使用しますが、sedそれ以上の機能があります。

    詳細man sedを参照してください。GNU sedには、Texinfo形式の完全なドキュメントも付属しています。info sedそれを読むために実行します(またはpinfo sed、pinfoビューアがインストールされている場合-それははるかに優れていますinfo)。同じドキュメントはhttps://www.gnu.org/software/sed/manual/でもさまざまな形式で入手できます。


この特定のケースではセミコロンが機能し、多くの sedコマンドで機能しますが、コマンドの一部には改行しか続かないため、 sedコマンドのセパレータとして使用できるわけではありません。
— don_crissti

それはつまり、より正確だ;のsedコマンドでの区切りであるを除いて、すべてのものの例外のための十分な理由を持っているいくつかのよく文書化された例外のために。たとえばa、追加、c変更、およびi挿入用。(エスケープされていない)改行までテキストを挿入、変更、または追加します。挿入されるテキストなどのセミコロンは、テキストの一部にすぎません。また、ファイルから読み取りまたは書き込みを行うコマンド、またはシェルコマンドを実行するコマンド(;sh自体によって使用され、ファイル名、引用符付き文字列などで有効な文字であるため)。これらはすべて、セミコロンではなく改行で終了します。
— cas


3

コマンドラインの最大長まで。コマンドラインの長さの制限は、シェルによってではなく、オペレーティングシステムによって課されます。通常、この制限は100キロバイトの範囲です。POSIXは、この制限ARG_MAXを示し、POSIX準拠システムでは、次を使用して照会できます。

$ getconf ARG_MAX    # Get argument limit in bytes

でテストする:

$ sed $(printf ' -e s/%s//g' $(seq 0001000000)) file

@issac私のシステムでは2097152、それは2Gを超えることを意味します。編集された質問を参照してください。
— alhelal

@alhelalいいえ、文字数です。ギガではなく2メガ強です。
— アイザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.