3つの異なるsedコマンド:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
3つとも、基本的なs///ubstitutionコマンドに基づいています。
s/"[^"]*"\n<[^>]*>/other characters /
また、sedsはエッジケースで出力が異なる傾向があるため、最後の行の処理に注意を払います。これは、最後$!では!ないすべての行に一致する住所の意味です$。
また、すべてNextコマンドを使用して、次の入力行を\newline文字に続くパターンスペースに追加します。sedしばらく使用している人は誰でも、\newlineキャラクターに依存することを学びます。これを取得する唯一の方法は、明示的にそこに置くことです。
3つすべては、アクションを実行する前に、可能な限り少ない入力を読み取るように試みsedます。そうする前に、入力ファイル全体を読み取る必要がない場合と同じようにすぐに動作します。
すべてを実行しますがN、3つすべてが再帰の方法が異なります。
最初のコマンド
最初のコマンドは非常に単純なN;P;Dループを採用しています。これらの3つのコマンドはPOSIX互換に組み込まれてsedおり、お互いをうまく補完します。
このコマンドは、ubstitutionステートメントに一致しない行に対してのみs///再帰します。ubstitutionはで追加されたs///ewlineを削除するため、pattern-spaceを選択しても何も残っていません。\nNsed D
Pおよび/またはD選択的に適用するためにテストを行うことができますが、その戦略によりよく適合する他のコマンドがあります。再帰は置換規則の一部のみに一致する連続する行を処理するように実装されているため、置換の両端に一致する連続する行のシーケンスはs///うまく機能しません。
この入力が与えられた場合:
first "line"
<second>"line"
<second>"line"
<second>line and so on
...印刷します...
first other characters "line"
<second>other characters line and so on
ただし、
first "line"
second "line"
<second>line
...大丈夫。
2番目のコマンド
このコマンドは3番目のコマンドとよく似ています。どちらも:b牧場/ tエストのラベルを使用しており(Joeseph R.の回答もここに示されています)、特定の条件が与えられた場合は再帰します。
-e :n -e-移植可能なsedスクリプトは:、\newlineまたは新しいインライン-executionステートメントのいずれかでラベル定義を区切ります。
:n-という名前のラベルを定義しnます。これは、bnまたはを使用していつでも戻すことができますtn。
tn- ラベルが定義された後、または最後に呼び出されてからestsが成功した場合、testコマンドは指定されたラベルに戻ります(または、何も指定されていない場合は、現在のラインサイクルのスクリプトを終了します)。s///t
このコマンドでは、一致する行に対して再帰が発生します。sedパターンが他の文字で正常に置き換えられた場合sed、:nラベルに戻って再試行します。s///置換が実行されない場合、sedパターンスペースが自動印刷され、次のラインサイクルが開始されます。
これは連続したシーケンスをよりよく処理する傾向があります。最後の1つが失敗した場合は、次のように出力されます。
first other characters other characters other characters line and so on
3番目のコマンド
述べたように、ここでのロジックは最後のものと非常に似ていますが、テストはより明確です。
/"$/bn-これはsedのテストです。branchコマンドはこのアドレスの関数であるため、ewlineが追加され、パターンスペースが二重引用符で終了した後にsedのみ、b牧場に戻ります。:n\n"
少しの間で行われるようにありますNし、b可能な限り-このようにsed非常に迅速に次の行は、あなたのルールに一致することができないことを保証するために必要な多くの入力として正確に収集することができます。s///ubstitutionは、ここではglobalフラグを使用するという点で異なります。したがって、必要なすべての置換を一度に行います。同一の入力が与えられた場合、このコマンドは最後まで同じように出力します。
\n私は尋ねる、なぜあなたが作るewline文です。他のほとんどのsがそのエスケープを右側で拒否するs//\n/でしょうが、GNUsedでできるようにできるかどうか尋ねられることはほとんどありませんsed。それでも、\nエスケープはどのPOSIXでも左側で機能し、同じように効果があるので常にsed移植可能に翻訳できます。y/c/\n/s/c/\n/g