3つの例があります:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/'
これは、で終わる行で機能するはずinです。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ out/ out/'
これは、からの構文エラーで失敗しますsed。最初の部分は有効なs///コマンドであり、2番目の部分の後のスラッシュまでinです。残りは、次のような新しいコマンドである必要があります。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/; s/:[^:]* out/ out/'
これは、のどのバージョンでも機能するinはずoutですsed。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ || out/ out/'
前の診断と同様に、最初の診断の後の資料s///は単に無効ですsed。
Standardsedは、適度に強力なバージョンの正規表現を使用しますが、完全なERE(拡張正規表現)ではありません。特に、代替(または代替)をサポートしていません。
一部の最新バージョンsed(特にGNU sed)は、EREおよびPCRE(Perl互換の正規表現)をサポートしています。
egrep -w 'TCP|UDP' denied.txt | sed -r 's/:[^:]* (in|out)/ \1/'
それができない場合、単一の置換で「in」と「out」を処理するには、次を使用できます。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* \([io][nu]t\{0,1\}\)/ \1/'
確かに、それはマップなどonにiutなりintます。あなたへの質問は、「そのような奇妙なことがあなたのデータで発生する可能性があるか」ということでしょう。その場合は、2つの明示的なコマンドの方が適しています。inouts///
最後に、すべての正規表現は、またはの$後の恩恵を受けて、行の終わりでのみ置換が行われるようにすることができます。inout