1

我有一个可以正常工作的正则表达式awk,但首先我需要将正则表达式存储在 shell 变量中

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

然后将shell变量传递给这样的awk变量

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

这可行,但我想在不使用 shell 变量的情况下执行此操作。我尝试在特殊字符之前使用转义符“\”但没有成功。

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 回答