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


95

私のサンプル文字列は次のとおりです:

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']
>>>

6
Pythonは間違いなく違いsedます。彼らの正規表現の味はかなり異なります。
tripleee 2013

回答:


91

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

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

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

6
ありがとうございます。しかし、私が.*試しsed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'てみると行全体を印刷するだけなので、なぜあなたの正規表現が必要なのかという疑問があります。
RanRag 2007

7
それが理由ですよね?試合の前後にあるものをすべてノーシングに置き換え、行全体を印刷します。
Tripleee

1
@tripleeeこれは印刷し2G05ないだけ02G05です。's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
うまくいく

1
これにより、正確に2桁にハードコードされます。sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'より一般的なものになります。(私はあなたのsedサポート\?が0回か1回であると想定しています。)
tripleee

参照してくださいstackoverflow.com/a/48898886/874188 Perlは同様にエスケープ様々な他の一般的な交換方法のため\w\sなど
tripleee

99

使用してみgrep -Eませんか?

echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'

3
+1これは簡単で、同じ行に複数の一致がある場合も正しく処理します。sedその場合、複雑なスクリプトを考案することができますが、なぜわざわざ?
tripleee

egrep拡張正規表現sedgrep使用し、標準正規表現を使用する、 egrepまたはgrep -eあるいはsed -EGNU grepのは、とのPCREを使用することができ、拡張正規表現を使用し、問題のPythonコードはPCRE(Perlの一般的な正規表現)を使用しています-Pオプション。
フェリペブッチョーニ

@FelipeBuccioniは実際にはegrepor grep -Eまたはsed -r
SensorSmith

単一の(最初の)一致の場合、 `|を追加します 別の質問に対するこの回答のとおり、head -1`(バッククォートなし)。
SensorSmith 2018

1
grep持って-m 1最初の試合後に停止します。
tripleee

5

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

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


試しましたsed -n '/[0-9]\+G[0-9]\+/p'。現在は文字列全体を出力します
RanRag


5

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

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

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


複数の一致がある場合、より一般的には最後のもの。
Tripleee

0

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

例:

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

2G05

これが標準の正規表現を使用する場合、角括弧\dは完全に不要です。
tripleee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.