sedに中括弧が必要なのはなぜですか?

sedに中括弧が必要なのはなぜですか?

sedで限られた範囲の検索をしたくて試してみました。

sed -n '195,210 /add/ p' <file>

これは

sed: -e 式 #1、文字 9: 不明なコマンド: `/'

純粋に推測として中括弧を追加してみました。

sed -n '195,210{/add/p}' <file>

成功しましたが、理解しようとしています。なぜ追加された校正器で動作します。
私はbashの中かっこが式を区別でき、実行順序を増やすことができることを理解しています。しかし、sedの場合、この中括弧は何をしていますか?

関連情報

$ sed --version
sed (GNU sed) 4.2.2

$ bash --version
GNU bash, version 4.3.11

答え1

~によるとPOSIX基準ページからsed:

スクリプトには、次の形式の編集コマンドを含める必要があります。

[住所[,住所]]機能

どこfunctionリスト内の1文字のコマンド動詞を表します。sedでコマンドを編集する、その後に適用可能なパラメータが続きます。

したがって、アドレスの後の空白でない最初の文字は、コマンド動詞と見なされます。場合によっては/エラーが発生しますchar 9: unknown command: '/'
中かっこは以下にさらに引用される。

[2住所]{編集コマンド
編集コマンド
...
}
    実行リストsedコマンドは、配列スペースを選択した場合にのみ編集できます。 …

  [2住所]は、許可される最大アドレス数が2つであることを意味します。

上記の点を明確にするために、住所部分sed(1)説明する:

Sedコマンドはアドレスなしで指定できます。この場合、コマンドはアドレスを持つすべての入力ラインで実行されます。この場合、コマンドはそのアドレスに一致する入力ラインでのみ実行されます。命令は、第1のアドレスから始まり第2のアドレスまで続くラインの包含範囲に一致する全ての入力ラインに対して実行される。アドレス範囲について注意する3つの点:構文は次のとおりです(つまり、アドレスはカンマで区切られています)。addr1,addr2

これGNU情報ページ(info sed「3.4共通コマンド」と{同様の説明があります。}

{注文する}
    命令セットは、{および}文字の間に含めることができます。これは、単一のアドレス(またはアドレス範囲)の一致で一連のコマンドをトリガーしたい場合に特に便利です。

つまり、中括弧は、同じアドレスに複数のコマンドまたはネストされたアドレスを適用するために使用されます。
ここでは標準は明確ではありませんが、開いた中括弧は{ 実際には別のsedコマンドグループを起動するコマンドです(グループは閉じ括弧で終わります})。

そして実際に行く危険を冒す長い話を短く、質問は195、、210および/add/両方です住所sed3 つのアドレスではどのコマンドも呼び出すことはできません。したがって、コマンドが機能するようにするには、アドレス{範囲でコマンドを呼び出し195,210てから(その範囲内で)アドレスpからコマンドを呼び出すことです/add/

答え2

sed中かっこに関する文書によると、中かっこはコマンドをグループ化するために使用されます。だから

sed -n '195,210{/add/p}' <file>

195,210ブロック命令を含むアドレス範囲が最初に考慮されます。ブロック命令は/add/アドレス指定と印刷命令で構成されます。p

答え3

sed 構文は次のとおりです。

住所/コマンド。

したがって、195,210が一致する最初のアドレスですが、この範囲で新しいコマンドを実行しようとしています。つまり、「add」を一致させてから印刷します。したがって、この追加のコマンドをグループ化するには、中かっこを使用する必要があります。

関連情報