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