1

で正常に動作する正規表現がawkありますが、最初に正規表現をシェル変数に保存する必要があります

valLat="^[-+]?(([0-9]+[d])?([0-9]+['])?([0-9]*[.]?[0-9]+[\"])?|[0-9]*[.]?[0-9]+)[NnSs]?$"

次に、シェル変数を次のawkような変数に渡します

echo 39d41\'17.766\"N | awk -v valLat=$valLat '{ if ($1 ~ valLat) print $1; else print "erro" }' 39d41'17.766"N

これは機能しますが、シェル変数を使用せずにこれを行いたいです。特殊文字の前にエスケープ「\」を使用しようとしましたが、成功しませんでした。

4

2 に答える 2

0

bash では、単一引用符で囲まれた文字列内の単一引用符をエスケープする方法はありません。 したがって、awk スクリプトには二重引用符を使用する必要があります。

echo 39d41\'17.766\"N | awk "{ if (\$1 ~ /^[-+]?(([0-9]+[d])?([0-9]+[\'])?([0-9]*[.]?[0-9]+[\"])?|[0-9]*[.]?[0-9]+)[NnSs]?$/ ) print \$1; else print \"error\" }"
于 2013-06-27T06:22:13.533 に答える
0

スクリプトをファイルに入れて awk -f を使用するか、ANSI エスケープ シーケンスを使用するか、単一引用符を使用\x27するなど、単一引用符の変数を定義します。

$ echo 39d41\'17.766\"N | awk '$1 ~ /^[-+]?(([0-9]+[d])?([0-9]+[\x27])?([0-9]*[.]?[0-9]+["])?|[0-9]*[.]?[0-9]+)[NnSs]?$/'
39d41'17.766"N
于 2013-06-27T12:57:59.833 に答える