次の行を表示するには正規表現を作成する必要があります。含む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()
プレフィックス(+357
、00357
または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