GNU/Linux >> Linux の 問題 >  >> Linux

SedまたはGrepを使用して正規表現に従って部分文字列を抽出しますか?

(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を使用して正規表現の一致を適切に行うにはどうすればよいですか。 またはgrepgrep -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

これにより、最後に出現した<...>のみが出力されます。 行ごとに。


Linux
  1. カラー出力をgrepする方法

  2. sed を使用して部分文字列を抽出する方法

  3. sed を使用して区切り文字で文字列を分割する

  1. 「sed」を追加しますか?

  2. Linux –単一の組み込みコマンドを使用してサブディレクトリ全体のファイルでサブストリングを検索しますか?

  3. sed 特定の行にスペースを含む挿入行

  1. 論理演算子を使用したGrep?

  2. SedですべてのCコメントを削除しますか?

  3. sed で \r 文字を削除する方法