regex 在awk中使用大正则表达式

deikduxw  于 2023-05-13  发布在  其他
关注(0)|答案(3)|浏览(126)

我有一个在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变量。我尝试在特殊字符前使用转义符“\”,但没有成功。

kyks70gy

kyks70gy1#

将脚本放入一个文件中,并使用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
33qvvth1

33qvvth12#

There is no way to escape single-quotes inside of single-quoted strings in 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\" }"
xytpbqjk

xytpbqjk3#

不需要“存储到文件”:使用octals
壳变量

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

输入匹配

echo 39d41\'17.766\"N |
mawk -F"$valLat" NF==2

相关问题