awk正規表現の一致に問題があります。特定の列を正規表現パターンと一致させようとしています(\"\.\"|0|1)
。この列には、"."
または値のみを含めることができます0
。1
しかし、私の正規表現パターンはawkでは一致しませんが、列のデータは"."
.どんなアイデアがありますか? ?
パスワード
awk -F "$delimitter" -v n="$column" -v m="$pattern" 'NR!=1 && $n !~ "^" m "$" {
printf "%s:%s:%s\n", FILENAME, FNR, $n > "/dev/stderr"
count++
}
END {print count+0}' input.txt 2>> errors.log
答え1
"."
パターンが(引用符を含む)または正確に一致するようにするには、パターンがまたは等でなければなりません0
。1
^("\."|[01])$
^("[.]"|[01])$
^("\."|0|1)$
ただし、次のように-v
パターンを渡すときawk
awk
\
-F x
-v FS=x
この問題は存在しないため、ENVIRON
シェルからランダムな文字列を渡すことをお勧めします。awk
だから:
pattern='"\."|0|1'
PATTERN=$pattern DELIMITER=$delimiter awk -v n="$n" '
BEGIN {FS = ENVIRON["DELIMITER"]; m = ENVIRON["PATTERN"]}
$n ~ "^(" m ")$" {...}'
(数字であると予想されるため、まだ-v
forを使用しているためバックスラッシュはありません。)n
上記(
を参照してください)
。初めてでも終わりでも^x|y$
。x
y
答え2
テキストを一致させるとき、「パターン」という単語は非常にあいまいなので、使用しないでください。参照する「文字列」または「正規表現」を使用してください。バラよりパターンに一致するテキストを見つける方法より多くの情報を知りたいです。
このバグを解決し、ハッシュルックアップの文字列比較は、よりクリーンで、あまり不安定で、より効率的な正規表現比較を使用しているようです。
valid='"."|0|1'
awk -F "$delimitter" -v n="$column" -v m="$valid" '
BEGIN {
split(m,tmp,"|")
for (i in tmp) {
valid[tmp[i]]
}
}
NR>1 && !($n in valid) {
printf "%s:%s:%s\n", FILENAME, FNR, $n > "/dev/stderr"
count++
}
END {print count+0}
' input.txt
シェル変数にエスケープシーケンスを含めることができる場合(例の変数には含まれません)https://stackoverflow.com/questions/19075671/how-do-i-use-shell-variables-in-an-awk-scriptまたは、-v
このように値をawkに渡す以外の方法です。ENVIRON[]
ARGV[]
答え3
あなたのパターンとして試してみてください[.01]
。
.
、、0
とのみ一致する角括弧式1
。
.
注:角かっこ式の外部では、次のようにエスケープする必要があります\.
(そうでない場合はすべての文字と一致します)。ただし、角かっこ式の内部ではリテラルとして扱われます。.