28

sedの専門家へのもう1つの質問。

2つの数字を含むパス名を表す文字列があります。例は次のとおりです。

./pentaray_run2/Trace_220560.dat

これらの数値の2番目を抽出する必要があります-つまり220560

私は(フォーラムの助けを借りて)すべての数字を一緒に(つまり2220560)抽出することができました:

sed "s/[^0-9]//g"

または、最初の番号のみを次のように抽出します。

sed -r 's|^([^.]+).*$|\1|; s|^[^0-9]*([0-9]+).*$|\1|'

でも私が求めているのは2番目の数字です!! どんな助けでも大歓迎です。

PS私がフォローしている番号は、常に文字列の2番目の番号です。

4

4 に答える 4

26

これでいい?

sed -r 's/.*_([0-9]*)\..*/\1/g'

あなたの例で:

kent$   echo "./pentaray_run2/Trace_220560.dat"|sed -r 's/.*_([0-9]*)\..*/\1/g'
220560
于 2012-10-19T12:21:13.763 に答える
12

これで最後の数字を抽出できます:

sed -e 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/'

これを逆に考える方が簡単です。

  1. 文字列の末尾から、0個以上の数字以外の文字に一致します
  2. 1つ以上の数字を一致(およびキャプチャ)する
  3. 少なくとも1つの数字以外の文字と一致する
  4. すべての文字を文字列の先頭に一致させます

一致のパート3は「魔法」が発生する場所ですが、一致の前に少なくとも1桁の数字がないように制限します(つまり、文字列の先頭にある1つの数字のみと一致させることはできません)。文字列。ただし、文字列の先頭に数字以外の数字を挿入するという簡単な回避策があります)。

魔法は.*(パート4)の左から右への貪欲に対抗することです。パート3がないと、パート4は数字を含めて可能な限りすべてを消費しますが、パート1と2で少なくとも1桁の数字が消費され、その後に数字が続くことを許可するために、マッチングは確実に停止します。番号をキャプチャできるようにします。

于 2012-10-19T12:37:23.443 に答える
7

どういたしましてgrep

$ echo './pentaray_run2/Trace_220560.dat' | grep -oP '\d+\D+\K\d+'
220560

そしてPerl、同じ正規表現でよりポータブルに:

echo './pentaray_run2/Trace_220560.dat' | perl -lne 'print $& if /\d+\D+\K\d+/'
220560

このアプローチは、使用するよりもクリーンで堅牢だと思いますsed

于 2012-10-19T12:25:34.400 に答える
6

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/([^0-9]*([0-9]*)){2}.*/\2/' file

これにより、2番目の数値が抽出されます。

sed -r 's/([^0-9]*([0-9]*)){1}.*/\2/' file

そしてこれは最初のものを抽出します。

于 2012-10-19T12:58:45.260 に答える