web-dev-qa-db-ja.com

特定の文字列の後に数値をgrepする正規表現

だから私は行があります:

ID: 54376

「ID:」なしの数値のみを返す正規表現の作成を手伝っていただけませんか?

注:この文字列はファイル内にあります。

8
Blake Gibbs

これを試して:

grep -oP '(?<=ID: )[0-9]+' file

または:

Perl -nle 'print $1 if /ID:.*?(\d+)/' file
13
cuonglm

一致するセグメントのみを取得するには、egrep-oとともに使用するか、grep-Eoオプションを指定して使用します。正規表現として[0-9]を使用して、数値のみを取得します。

grep -Eo [0-9]+ filename
4
Rohit Jain
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'

これは、ファイル入力でID: 54376の後にあるすべての数字とスペースのみを出力します。

{numeric、space}文字を削除した後、空白行をprintしないように*で少し速くするために、上記を少し更新しました。

正規表現/ID: 54376/,から$lastまでの行をアドレス指定し、その上でs///_すべてまたは一部の*characters ^not _[^ 0-9]*を削除し、次にprints /any/行に.文字が残っています。

デモ:

{
echo line 
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'

出力:

 54376
1  03  2
3  03  4
5  03  6
7  03  8
9  03  10
 54376
4
mikeserv

これには多数の方法があります。例えば:

  1. GNU grepを最近のPCREで使用し、ID:の後の数値と一致させます。

    grep -oP 'ID:\s*\K\d+' file
    
  2. awkを使用し、ID:で始まるすべての行の最後のフィールドを出力します

    awk '/^ID:/{print $NF}' file
    

    ただし、数値ではないフィールドも出力されます。数値のみを取得するには、2番目のフィールドのみを使用します。

    awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
    
  3. GNU grepを拡張正規表現で使用し、2回解析します。

    grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
    
4
terdon

Sedの使用:

{
    echo "ID: 1"
    echo "Line doesn't start with ID: "
    echo "ID: Non-numbers"
    echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'

-nは「デフォルトでは何も印刷しない」、/^ID: [0-9][0-9]*$/は「この正規表現に一致する行の場合」(「ID:」で始まり、1桁以上、次に行末)、およびs/ID: //pの形式はs/pattern/repl/flags-sは、パターンを置き換えるために、代替を行っていることを意味します"ID: "置換テキスト付き""(空の文字列)pフラグを使用します。これは、「置換後にこの行を出力する」ことを意味します。

出力:

1
4
1
godlygeek

Grep + awkを使用します。

  grep "^ID" your_file | awk {'print $2'}

ボーナス:読みやすい:)

0
lily

別のGNU sedコマンド、

sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file

ID:の後に任意の数字を出力します

0
Avinash Raj