(BSD)UNIX環境で、正規表現を使用して特定のサブストリングをキャプチャしたいと思います。
dmesg
と仮定します コマンド出力には次の行が含まれます:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
<
の間のテキストをキャプチャしたい および>
のような文字
dmesg | <sed command>
出力する必要があります:
Marvell Console 1.01
ただし、正規表現が一致しない場合は何も出力されません。 sed -e 's/$regex/1/
を含む多くのソリューション 一致するものが見つからない場合、入力全体を出力します。これは私が望むものではありません。
対応する正規表現は次のようになります:
regex="^pass2: <(.*)>"
sed
を使用して正規表現の一致を適切に行うにはどうすればよいですか。 またはgrep
? grep -P
に注意してください このオプションは私のBSDUNIXディストリビューションでは利用できません。 sed -E
ただし、オプションは利用可能です。
承認された回答:
これを試してください
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
またはPOSIXly(-E
2019年の時点ではまだPOSIX標準に到達していません):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
出力:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
これにより、最後に出現した<...>
のみが出力されます。 行ごとに。