GREPは他のデータの6〜7桁の数字と一致します。

GREPは他のデータの6〜7桁の数字と一致します。

6桁または7桁の数値文字列に一致する正規表現を作成しようとしています。

[0-9]{6,7} これはうまくいきますが、7桁より長い文字列を一致させたくありません。

太字を一致させる必要がある場合は、下記のサンプルデータをご覧ください。一部の6〜7桁の文字列の先頭と末尾にさまざまな文字(改行、タブ、スペース)があり、文字列の先頭に2つ以上のゼロが一致することを望まない。

1139055_00000000000000.jpg1139065_00000000000000.jpg

12345678 1045977_00000000000000.jpg

_1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psdタイトル:0582457_00_CC 0123456789タイトル:6844393_50_v2タイトル:6844393_50_v2.psd 0001456789 0000001546800000

合計: 14 6582457_00_C 5142090_00_c ID:1178287タイトル:6582457_00_CCタイトル:6844393_50_v2 ID:1178288タイトル:_0042090_00_cc __6771292_00_cc

入力例:

1139055_00000000000000.jpg 1139065_00000000000000.jpg
12345678 1045977_00000000000000.jpg
_1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psd Title: 0582457_00_CC 0123456789 Title: 6844393_50_v2 Title: 6844393_50_v2.psd 0001456789 0000001546800000
Total: 14 6582457_00_C 5142090_00_c Id: 1178287 Title: 6582457_00_CC Title: 6844393_50_v2 Id: 1178288 Title: _0042090_00_cc __6771292_00_cc

予想出力:

1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

助けてくれてありがとう。

答え1

要約すると、マッチしたい二つ小数点以下の桁数の少なくとも 1 つは 0 でなければならず、その後に他の桁数が続くはずです。4つまたは5つ前後に他の数字がない10進数ですか?

その場合は、PCRE モードで GNU grep を使用して以下を見つけます。

grep -P '(?<!\d)([1-9][0-9]|[0-9][1-9])[0-9]{4,5}(?!\d)'

次のコマンドを使用して入力をテストします-o

$ grep -Po '(?<!\d)([1-9][0-9]|[0-9][1-9])[0-9]{4,5}(?!\d)' << \EOF
    1139055_00000000000000.jpg 1139065_00000000000000.jpg

    12345678 1045977_00000000000000.jpg

    _1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psd Title: 0582457_00_CC 0123456789 Title: 6844393_50_v2 Title: 6844393_50_v2.psd 0001456789 0000001546800000

    Total: 14 6582457_00_C 5142090_00_c Id: 1178287 Title: 6582457_00_CC Title: 6844393_50_v2 Id: 1178288 Title: _0042090_00_cc __6771292_00_cc
EOF
1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

答え2

単純な解決策が必要であり、単一の正規表現が必要ないと仮定した場合は、GNU awk(ほとんどのUnixシステムで利用可能またはインストール可能)を使用して複数文字を処理しますRS

$ awk -v RS='[^0-9]+' '!/^00/ && /^.{6,7}$/' file
1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

または、すべてのUnixシステムのシェルでawkを使用して、次のことを実行できます。

awk -F'[^0-9]+' '{ for (i=1; i<=NF; i++) if ( ($i !~ /^00/) && (length($i) ~ /^[67]$/) ) print $i }' file

また、正規表現間隔表記のためのPOSIX awk(MacOSのBSD awkを含む)を使用すると、{6,7}awkへの以前の呼び出しを使用して、数値以外のすべての文字列を改行文字に変換して、デフォルト値が次のようになりますRS

awk '{gsub(/[^0-9]+/,RS)} 1' file | awk '!/^00/ && /^.{6,7}$/'

またはもう一度awkを使用してください。

awk '{gsub(/[^0-9]+/,RS)} 1' file | awk '!/^00/ && (length() ~ /^[67]$/)'

ご希望のバージョンで使用している場合は、代わりにまたはtr -cs '0-9' '\n' < file同様のバージョンを使用できます。awk '{gsub(/[^0-9]+/,RS)} 1' filetr

答え3

grep、sed、awk チェーンは必要なリストを提供します。

$ egrep '[0-9]*' -o Q768182 | sed '/00/d' | awk 'length>5 && length <8'
1139055
1139065
1045977
1162679
1099695
1099692
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

答え4

この正規表現は、あなたの例に合った作業を行うようです。

(?:[^0-9]|^)((?:0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5})(?:[^0-9]|$)
  • (?:[^0-9]|^):行の先頭または前の文字が数字でないことを確認してください。
  • ((?:0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5}):先頭に00を除く6〜7桁の数字を取得します。
  • (?:[^0-9]|$):行末または後ろの文字が数字ではないことを確認してください。

君はそれを持って遊べるhttps://regex101.com/r/scZc9q/1

最初/最後の文字が一致する文字列にあるため、これを使用する最も簡単な方法は、次のようにgrepこれらの文字を削除することですsed

grep -oE '([^0-9]|^)(0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5}([^0-9]|$)' tmp | sed 's/[^0-9]//g'

関連情報