だから私は行があります:
ID: 54376
「ID:」なしの数値のみを返す正規表現の作成を手伝っていただけませんか?
注:この文字列はファイル内にあります。
これを試して:
grep -oP '(?<=ID: )[0-9]+' file
または:
Perl -nle 'print $1 if /ID:.*?(\d+)/' file
一致するセグメントのみを取得するには、egrep
を-o
とともに使用するか、grep
を-Eo
オプションを指定して使用します。正規表現として[0-9]
を使用して、数値のみを取得します。
grep -Eo [0-9]+ filename
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
これは、ファイル入力でID: 54376
の後にあるすべての数字とスペースのみを出力します。
{numeric、space}文字を削除した後、空白行をp
rintしないように*
で少し速くするために、上記を少し更新しました。
正規表現/ID: 54376/
,
から$
lastまでの行をアドレス指定し、その上でs///
_すべてまたは一部の*
characters ^
not _[^ 0-9]*
を削除し、次にp
rints /
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
これには多数の方法があります。例えば:
GNU grep
を最近のPCREで使用し、ID:
の後の数値と一致させます。
grep -oP 'ID:\s*\K\d+' file
awk
を使用し、ID:
で始まるすべての行の最後のフィールドを出力します
awk '/^ID:/{print $NF}' file
ただし、数値ではないフィールドも出力されます。数値のみを取得するには、2番目のフィールドのみを使用します。
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
GNU grepを拡張正規表現で使用し、2回解析します。
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
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
Grep + awkを使用します。
grep "^ID" your_file | awk {'print $2'}
ボーナス:読みやすい:)
別のGNU sedコマンド、
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file
ID:
の後に任意の数字を出力します