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' file
tr
答え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'