|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『楼 主』:
我的AWK不能打印字符串
gawk "BEGIN{print "The start"}"
上面代码不能正确打印出The start串
请斑竹帮忙分析原因,和平台有关吗(WIN2000)
—————————————— willsort 版务记录 ——————————————
分割主题:{18102}如何用批处理按标记分割文件 的最后两帖合并至此
操作原因:二主题存在上下文的直接联系
版主提示:主题分割合并后,帖子会依照发帖时间重新排列,因而会影响阅读顺序
—————————————— willsort 版务记录 ——————————————
[ Last edited by willsort on 2005-12-19 at 22:33 ]
|
|
2005-12-18 14:11 |
|
|
tigerpower
中级用户
大师兄
积分 377
发帖 99
注册 2005-8-26
状态 离线
|
『第
2 楼』:
gawk "BEGIN {print \"The start\"}"
|
|
2005-12-18 15:46 |
|
|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『第
3 楼』:
非常感谢谢 tigerpower ,终于知道了,资料上难道说的是在UNIX平台,才不需要\"
|
|
2005-12-18 18:06 |
|
|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『第
4 楼』:
学习了一段时间,幸好有点C基础,要不茫然了,对前辈的AWK代码研究了下,
其实中间变量不会降低效率,因为它是内存操作
象 print $0 >> \"temp\"
属于硬盘操作,每行都有次动作,效率会底点,但斑竹的代码更简洁,而且调用了system()函数,不过REN的操作是非常快的,几乎可以忽略时间
另外,有点不明白的地方就是 ,WIN下用 双引号 代替了 单引号 ,而带反斜杠的双引号代替了原来的双引号,请各位大大告知这是基于什么原因
|
|
2005-12-19 08:49 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
5 楼』:
Re yhsean:
这与两种平台不同的命令行特性有关。
在 Windows 的命令行环境中,如果某个参数含有空格或其它有特殊含义的字符,只有用双引号括起,才能作为字符串的一部分而不被转义。单引号不具有此作用。
而 gawk 等命令行工具,只会从特定的一个参数中获取脚本内容,而如果这个脚本中含有空格,就必须用双引号引起,否则空格后的部分会被当作下一个参数,而被 gawk 等忽略。
而一旦使用了双引号,则双引号也成了特殊的转义符号,而 gawk 等的脚本中也可能出现双引号,这时就可能出现双引号匹配的二义性问题:是相邻的双引号进行匹配,还是两端的双引号进行匹配?Windows 为了更好的支持参数选择了后者,而 gawk 为了支持脚本,则选择了前者。
这样,类似 gawk "BEGIN{print "The start"}" 的命令行显然就有问题。The Start 被置于双引号之外,不再是一个字符串了。为了解决这个问题, gawk 中使用\对 The Start 前的双引号进行再次转义,此时它不再会匹配BEGIN之前的双引号,而会直接被读入脚本中,与后面的双引号进行匹配。
应该就是这样了,各位还有什么见解,不妨提出来,一起讨论一下。
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2005-12-19 18:05 |
|
|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『第
6 楼』:
理解斑竹的意思
但是为何舍弃了单引号。因为将双引号置于单引号中,这种二义性的解释就不存在了
因为可以将单引号内的内容看作 AWK 的命令内容 ,而与WINDOWS无关,除非在单
引号外,也就是说在单引号内无论发生什么,WIN无权利干涉
即 见到AWK ,AWK就应该有一种机制叫WIN理解其单引号做法。
[ Last edited by yhsean on 2005-12-19 at 19:38 ]
|
|
2005-12-19 19:23 |
|
|
tigerpower
中级用户
大师兄
积分 377
发帖 99
注册 2005-8-26
状态 离线
|
『第
7 楼』:
Quote: | Originally posted by yhsean at 2005-12-19 08:49:
...有点不明白的地方就是 ,WIN下用 双引号 代替了 单引号 ,而带反斜杠的双引号代替了原来的双引号... |
|
是因为环境不一样
在Windows xp中是 cmd, 下面前两语句是错误的, 最后一句是对的:
cd 'C:\Program Files'
'calc'
"calc"
在Unix中是shell, 上面的mawk脚本, 在Unix中是
mawk -F"*" '/\*/ {printf t>$2 ".txt";t="";next};{t=t $0 "\n"}' aa.txt
或
mawk -F"*" '
/\*/ {printf t>$2 ".txt"
t=""
next}
{t=t $0 "\n"}
' aa.txt
某些dos版本可以使用单引号, 例如可以这样用:
echo.|awk '{print "Hello world!"}'
但在其他win32的版本中似乎不行.
|
|
2005-12-19 20:51 |
|
|
无奈何
荣誉版主
积分 1338
发帖 356
注册 2005-7-15
状态 离线
|
『第
8 楼』:
总算可以有点时间上上网了。
to yhsean
因为 CMD 不识别单引号为其间不做解释的特殊字符,只认可双引号并对其间字符做部分解释, CMD 下没有提供像 UNIX 下单引号作用相同的特殊字符,这是没有办法的事,只能如此迁就。
再者是 CMD 将命令解释后提交 AWK ,而 AWK 不能也没办法还原 CMD 提交前的原始命令的。
|
☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul
|
|
2005-12-19 21:04 |
|
|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『第
9 楼』:
终于领悟到AWK的魅力,易学 强大适用
介于上面问题,特搜寻了一个WIN32版SHELL程序,贴出给大家共享
另外,在写BAT文件的时候,为了一个文件完成(勿需要单独建立AWK脚本),如此一来
为了写出可读性好的程序,是否有办法,一个ECHO或别的办法产生出AWK脚本
MY.BAT内容如下
set file=input.txt
>my.awk echo {
>>my.awk echo BEGIN { }
>>my.awk echo {
...
>>my.awk echo }
>>my.awk echo END { }
>>my.awk echo }
mawk -f my.awk %file%
del my.awk
测试中,注意到如果在文件中引用AWK脚本 ,其中的双引号不需要 转义(my.awk 对于 " 不需写成 \")
[ Last edited by yhsean on 2005-12-22 at 09:34 ]
附件
1: sh.rar (2005-12-21 12:10, 186.54 K, 下载附件所需积分 1 点
,下载次数: 14)
|
|
2005-12-21 12:06 |
|
|
yhsean
初级用户
积分 90
发帖 26
注册 2005-12-5
状态 离线
|
『第
10 楼』:
Quote: | Originally posted by willsort at 2005-12-19 18:05:
Re yhsean:
...是相邻的双引号进行匹配,还是两端的双引号进行匹配?Windows 为了更好的支持参数选择了后者,而 gawk 为了支持脚本,则选择了前者。 |
|
斑竹提到的引号配对问题,CMD在有些情况下配对甚是模糊,
假设 %~f0 返回值 d:\aa bb\cc\my.bat
如 echo. """%~f0""" (看见别人在ECHO后加个. 我也加了个,还不知道原因,郁闷中...)
[为了在批处理文件中测试 我改为了net send * """%~f0"""]
将输出 "d:\aa bb\cc\my.bat"
而非 ""d:\aa bb\cc\my.bat""
也非 d:\aa bb\cc\my.bat (而echo. ”%~f0" 将输出该串 )
[ Last edited by yhsean on 2005-12-22 at 13:14 ]
|
|
2005-12-22 12:38 |
|