2つの特定の数字の後に6桁の行を見つける

2つの特定の数字の後に6桁の行を見つける

次の行を表示するには正規表現を作成する必要があります。含む94、95、96、97、99。

grep -P '(94|95|96|97|99)'

この 2 桁の数字の後には 6 桁以上が来る可能性が最も高いですが、間に空白がある可能性があるため削除する必要があります。

sed 's/\(.\) /\1/g'

その後、357、00357、または+357への言及をすべて削除する必要があります。

sed 's/\(357\|00357\|+357\)//g'

最後にすべきことは、1行に6桁しかないことを確認することです。後ろに上記のオリジナル2。だから各行は含む94、95、96、97、99で始まる合計8桁の数字。数字が8個を超えるか少ない場合、その行は私には役に立ちません。

各行には、94、95、96、97、または99で始まる数字が含まれており、その後に6桁の数字しかないことを確認し、その行のみを表示するにはどうすればよいですか?

入力は次のとおりです。

2020-11-03  13:00   2020-11-03  14:00   99 123456
2020-11-03  13:00   2020-11-03  14:00   9412 3456
2020-11-03  13:00   2020-11-03  14:00   95123456
2020-11-03  13:00   2020-11-03  14:00   456345 3453543654567
2020-11-03  13:00   2020-11-03  14:00   +357678423683
2020-11-03  13:00   2020-11-03  14:00   00357584903
2020-11-03  13:00   2020-11-03  14:00   +35 799 1276 45
2020-11-03  13:30   2020-11-03  14:30   97123456

期待される出力は次のとおりです

2020-11-03  13:00   2020-11-03  14:00   99123456
2020-11-03  13:00   2020-11-03  14:00   94123456
2020-11-03  13:00   2020-11-03  14:00   95123456
2020-11-03  13:00   2020-11-03  14:00   99127645
2020-11-03  13:30   2020-11-03  14:30   97123456

ベストアンサー1

を使用すると、perl次のことができます。

perl -lne 'if (/\t\K(?:(?:\+|00)? ?3 ?5 ?7 ?)?(9[4-9]( ?\d){6})\s*$/) {
           s{}{$1 =~ s/ //gr}e; print}' < file

sed次のとおりです(拡張正規表現サポートを使用して実装すると仮定)-E

eval "$(printf 'NL="\n" TAB="\t"')"
LC_ALL=C sed -E "
  /$TAB((00|\+)?3 ?5 ?7 ?)?(9[4-9]( ?[0-9]){6})[[:space:]]*\$/!d
  s//$TAB\\$NL\3/;  # separate prefix and 8 digits
  h;                # save a copy
  s/.*\n//;         # extract 8 digits
  s/ //g;           # remove spaces among digits
  G;                # append saved copy and keep prefix and trimmed digits:
  s/(.*)\n(.*)\n.*/\2\1/" < file

ここでは、入力例のようにフィールドがTABで区切られていると仮定し、そのような偽の肯定を避けるためにTABに従ったときにのみ数字を見つけます+1 996 123456

おすすめ記事