これを行うための移植可能な方法-より効率的な方法-はアドレスを使用する方法です。あなたはこれを行うことができます:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
このように、行に文字列catが含まれておらず、文字列dog が含まれていない場合sed
b
、スクリプトから現在の行が自動印刷され、次の行がプルされて次のサイクルが開始されます。したがって、次の命令は実行されません。この例でc
は、Bearを読み取るために行全体がハングしますが、何でもできます。
また!b
、そのsed
コマンドの次のステートメントは、文字列または- を含む行でのみ一致するので、注意してください-一致しない行と一致する危険なしに、さらにテストを実行できます-これは、ルールを適用できることを意味しますどちらか一方だけにも。dog
cat
しかし、それは次です。上記のコマンドからの出力は次のとおりです。
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
後方参照を使用してルックアップテーブルを移植可能に実装することもできます。
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
この単純な例の場合、セットアップするのはかなり手間がsed
かかりますが、長期的にははるかに柔軟なスクリプトを作成できます。
最初の行では、x
ホールドスペースとパターンスペースを変更し、文字列<space>
cat <space>
dog<space>
をホールドスペースに挿入しx
てから元に戻します。
それ以降、後続のすべての行でG
パターンスペースに追加されたスペースを保持し、行の先頭から最後に追加した改行までのすべての文字が、スペースで囲まれた文字列に一致するかどうかを確認します。その場合、ロット全体をベアに置き換えます。そうでない場合はP
、パターンスペースで最初に出現する改行までしかd
リントしないため、害はありません。
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
そして、私が柔軟と言うとき、私はそれを意味します。ここでは、catをBrownBearに、dogをBlackBearに置き換えています。
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
もちろん、ルックアップテーブルの内容を大幅に拡張することができます。90年代に、彼が単一のステートメントから粗い計算機を構築する方法を説明したときに、主題に関するGreg Ubbenの usenetメールからアイデアを選びましたsed s///
。
-r
同義語としてこのオプションをサポートしています-E
。OpenBSDおよびOS Xsed -E
は、エスケープされたパイプを、代替演算子ではなくリテラルパイプとして解釈します。ここでは作業リンクの NetBSDのmanページには、と、ここで一つだ 10歳ではありませんOpenBSDのため。