1. ホーム
  2. regex

[解決済み] sedでキャプチャしたグループのみを出力するには?

2022-03-17 11:25:34

質問

を指定する方法はありますか? sed キャプチャしたグループのみを出力するようにできますか?

例えば、入力があった場合。

This is a sample 123 text and some 987 numbers

そしてパターン。

/([\d]+)/

バックリファレンスでフォーマットされた方法で123と987だけを出力させることは可能でしょうか?

解決方法は?

これを動作させるための鍵は sed は、出力させたくないものを除外し、出力させたいものを指定します。

string='This is a sample 123 text and some 987 numbers'
echo "$string" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'

ということが書かれています。

  • は、各行を印刷することをデフォルトにしないでください ( -n )
  • 0以上の非桁を除外する
  • 1つ以上の数字を含む
  • 1つまたは複数の数字以外を除外する
  • 1つ以上の数字を含む
  • 0以上の数字以外を除外する
  • 置換を表示する ( p )

一般に sed は、括弧を使ってグループを捕捉し、捕捉したものをバックリファレンスを使って出力します。

echo "foobarbaz" | sed 's/^foo\(.*\)baz$/\1/'

は "bar" を出力します。もし -r ( -E OS Xの場合)拡張正規表現では、括弧をエスケープする必要はありません。

echo "foobarbaz" | sed -r 's/^foo(.*)baz$/\1/'

キャプチャーグループとそのバックリファレンスは最大9個まで可能です。後方参照はグループが現れる順番に番号が振られていますが、どのような順番でも使用でき、繰り返し使用することも可能です。

echo "foobarbaz" | sed -r 's/^foo(.*)b(.)z$/\2 \1 \2/'

は "a bar a" を出力します。

もし、あなたがGNU grep (OSXを含むBSDでも動作する場合があります)。

echo "$string" | grep -Po '\d+'

などのバリエーションがあります。

echo "$string" | grep -Po '(?<=\D )(\d+)'

-P オプションは Perl Compatible Regular Expressions を有効にします。参照 man 3 pcrepattern または man 3 pcresyntax .