mawk中regular expression的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
送出感谢: 0
接收感谢: 0
联系:

mawk中regular expression的问题

#1

帖子 nobrain » 2006-09-28 12:52

$awk '{ gsub("\\N", "\n", $0) ; print $0 }'
输入:haha\Nxixi
输出:haha\
xixi

$awk '{ gsub{"\\N", "^",$0) ; print $0 }'
输入:hahaNNN
输出:haha^^^
只是把N替换掉了


$awk '{ gsub(/\\N/, "\n", $0) ; print $0 }'
输入:haha\Nxixi
输出:haha
xixi
这是想要的结果。

为什么两种方式会得到不一样的结果?
爱喝真猪奶茶的夜鸣猪
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

#2

帖子 laborer » 2006-09-29 3:51

\\首先是被bash解析为\,再放入字符串的,也就是说awk看到的命令是

代码: 全选

{ gsub("\N", "\n", $0) ; print $0 }
然后awk再将"\N"解析为"N",自然就得到了第一种结果。后一种情况/\N/不是字符串,awk也不会去解析\N。所以解决的方法可以是将"\\N"改为"\\\\N"。体会一下下面这个例子就能明白了。

代码: 全选

xshu@boxter:~$ echo "\n"
\n
xshu@boxter:~$ echo "\\n"
\n
xshu@boxter:~$ echo "\\\n"
\\n
xshu@boxter:~$ echo "\\\\n"
\\n
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
送出感谢: 0
接收感谢: 0
联系:

#3

帖子 nobrain » 2006-09-29 12:28

我用了单引号,应该阻止了bash解析单引号中的内容

代码: 全选

echo '\\\\N'
\\\\N
爱喝真猪奶茶的夜鸣猪
回复

回到 “Shell脚本”