(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
BSD UNIXディストリビューションではこのオプションを使用できません。ただし、sed -E
オプションを使用できます。
ベストアンサー1
この試み、
sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'
またはPOSIXly(-E
2019年現在のPOSIX規格ではありません):
sed -n 's/^pass2:.*<\(.*\)>.*$/\1/p'
出力:
$ printf '%s\n' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'
Marvell Console 1.01
<...>
これにより、各行の最後の項目のみが印刷されます。