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

答え2

awkを使う

awk '{
    match($0,/^([^[:space:]]+[[:space:]]+){4}/)
    last_part = substr($0,RLENGTH+1)

    gsub(/[[:space:]]/,"",last_part)
    gsub(/^(+|00)357/,"",last_part)

    if (last_part ~ /^9[45679]/ && length(last_part) == 8) {
        printf "%s%s\n", substr($0,1,RLENGTH), last_part
    }
}' file

出力:

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

説明する:

  • match()最初の4つのフィールドをスペースと一致させた後、組み込み変数は最初のRLENGTH部分の終わりを維持します。フィールドに分割することもできますが、この場合、最初のソートを維持し、開始される数値範囲のインデックス(現在は)と簡単に一致させるために分割することは好きではありませんRLENGTH+1

  • gsub()数値領域のすべてのスペースを削除して始めます。便宜上、これを2つのステップで実行します(他のことを心配しないように+35 7)。

  • 2番目のステップでは、gsub()プレフィックス(+35700357または357)を見つけて削除します。

  • 最後に、数値範囲が目的のプレフィックスで始まる場合そして長さは8文字(printf改行文字)です。

引用:GNU awk文字列関数

答え3

私は次のようになります:

  Space
  9
  5 through 9
  0 or 1 Space
  6 digits
  a non-digit


grep -E ' 9[5-9] ?[0-9]{6}[^0-9]' file

関連情報