次の行を表示するには正規表現を作成する必要があります。含む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
。