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つの明示的なコマンドの方が適しています。in
out
s///
最後に、すべての正規表現は、またはの$
後の恩恵を受けて、行の終わりでのみ置換が行われるようにすることができます。in
out