web-dev-qa-db-ja.com

sedを使用して文字列からテキストを抽出する方法は?

私の例の文字列は次のとおりです。

This is 02G05 a test string 20-Jul-2012

ここで、上記の文字列から02G05を抽出します。そのために、私はsedで次の正規表現を試しました

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

しかし、上記のコマンドでは何も出力されず、sedに指定したパターンに対して何も一致しないと思われる理由があります。

だから、私の質問は私がここで間違っていることとそれを修正する方法です。

上記の文字列とパターンをpythonで試してみると、結果が得られます

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
74
RanRag

パターン\dは、sedでサポートされていない可能性があります。代わりに[0-9]または[[:digit:]]を試してください。

一致する行全体ではなく、実際の一致のみを印刷するには、置換を使用します。

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
68
tripleee

egrepを使用してはどうですか?

echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
80
mVChr

sed\dを認識しません。代わりに[[:digit:]]を使用してください。また、+をエスケープするか、-rスイッチ(OS Xでは-E)を使用する必要があります。

[0-9]は、アラビア語-ヒンドゥー教の数字でも機能することに注意してください。

4

代わりにこれを試してください:

echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'

ただし、1行に2つのパターンがある場合、2番目のパターンが出力されることに注意してください。

4
Zsolt Botykai

rextract を使用してみてください。正規表現を使用してテキストを抽出し、再フォーマットできます。

例:

$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'

2G05
0
Tim Savannah