![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-23 16:05 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 我的AWK不能打印字符串 |
| 可打印版本 1,684 / 9 |
| 第1楼 yhsean | 发表于 2005-12-18 14:11 |
| 初级用户 发帖 26 积分 90 | |
|
我的AWK不能打印字符串 gawk "BEGIN{print "The start"}"
上面代码不能正确打印出The start串 请斑竹帮忙分析原因,和平台有关吗(WIN2000) —————————————— willsort 版务记录 —————————————— 分割主题:{18102}如何用批处理按标记分割文件 的最后两帖合并至此 操作原因:二主题存在上下文的直接联系 版主提示:主题分割合并后,帖子会依照发帖时间重新排列,因而会影响阅读顺序 —————————————— willsort 版务记录 —————————————— [ Last edited by willsort on 2005-12-19 at 22:33 ] |
|
| 第2楼 tigerpower | 发表于 2005-12-18 15:46 |
| 中级用户 发帖 99 积分 377 | |
|
gawk "BEGIN {print \"The start\"}"
|
|
| 第3楼 yhsean | 发表于 2005-12-18 18:06 |
| 初级用户 发帖 26 积分 90 | |
|
非常感谢谢 tigerpower ,终于知道了,资料上难道说的是在UNIX平台,才不需要\"
|
|
| 第4楼 yhsean | 发表于 2005-12-19 08:49 |
| 初级用户 发帖 26 积分 90 | |
|
学习了一段时间,幸好有点C基础,要不茫然了,对前辈的AWK代码研究了下,
其实中间变量不会降低效率,因为它是内存操作 象 print $0 >> \"temp\" 属于硬盘操作,每行都有次动作,效率会底点,但斑竹的代码更简洁,而且调用了system()函数,不过REN的操作是非常快的,几乎可以忽略时间 另外,有点不明白的地方就是 ,WIN下用 双引号 代替了 单引号 ,而带反斜杠的双引号代替了原来的双引号,请各位大大告知这是基于什么原因 |
|
| 第5楼 willsort | 发表于 2005-12-19 18:05 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re yhsean:
这与两种平台不同的命令行特性有关。 在 Windows 的命令行环境中,如果某个参数含有空格或其它有特殊含义的字符,只有用双引号括起,才能作为字符串的一部分而不被转义。单引号不具有此作用。 而 gawk 等命令行工具,只会从特定的一个参数中获取脚本内容,而如果这个脚本中含有空格,就必须用双引号引起,否则空格后的部分会被当作下一个参数,而被 gawk 等忽略。 而一旦使用了双引号,则双引号也成了特殊的转义符号,而 gawk 等的脚本中也可能出现双引号,这时就可能出现双引号匹配的二义性问题:是相邻的双引号进行匹配,还是两端的双引号进行匹配?Windows 为了更好的支持参数选择了后者,而 gawk 为了支持脚本,则选择了前者。 这样,类似 gawk "BEGIN{print "The start"}" 的命令行显然就有问题。The Start 被置于双引号之外,不再是一个字符串了。为了解决这个问题, gawk 中使用\对 The Start 前的双引号进行再次转义,此时它不再会匹配BEGIN之前的双引号,而会直接被读入脚本中,与后面的双引号进行匹配。 应该就是这样了,各位还有什么见解,不妨提出来,一起讨论一下。 |
|
| 第6楼 yhsean | 发表于 2005-12-19 19:23 |
| 初级用户 发帖 26 积分 90 | |
|
理解斑竹的意思
但是为何舍弃了单引号。因为将双引号置于单引号中,这种二义性的解释就不存在了 因为可以将单引号内的内容看作 AWK 的命令内容 ,而与WINDOWS无关,除非在单 引号外,也就是说在单引号内无论发生什么,WIN无权利干涉 即 见到AWK ,AWK就应该有一种机制叫WIN理解其单引号做法。 [ Last edited by yhsean on 2005-12-19 at 19:38 ] |
|
| 第7楼 tigerpower | 发表于 2005-12-19 20:51 |
| 中级用户 发帖 99 积分 377 | |
Originally posted by yhsean at 2005-12-19 08:49: 是因为环境不一样 ![]() 在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的版本中似乎不行. |
|
| 第8楼 无奈何 | 发表于 2005-12-19 21:04 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
总算可以有点时间上上网了。
to yhsean 因为 CMD 不识别单引号为其间不做解释的特殊字符,只认可双引号并对其间字符做部分解释, CMD 下没有提供像 UNIX 下单引号作用相同的特殊字符,这是没有办法的事,只能如此迁就。 再者是 CMD 将命令解释后提交 AWK ,而 AWK 不能也没办法还原 CMD 提交前的原始命令的。 |
|
| 第9楼 yhsean | 发表于 2005-12-21 12:06 |
| 初级用户 发帖 26 积分 90 | |
|
终于领悟到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 ] 附件 sh.rar (186.54 KiB) |
|
| 第10楼 yhsean | 发表于 2005-12-22 12:38 |
| 初级用户 发帖 26 积分 90 | |
Originally posted by willsort at 2005-12-19 18:05: 斑竹提到的引号配对问题,CMD在有些情况下配对甚是模糊, 假设 %~f0 返回值 d:\aa bb\cc\my.bat 如 echo. """%~f0""" (看见别人在ECHO后加个. 我也加了个,还不知道原因,郁闷中...) 将输出 "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 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |