免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: 心若寒江雪
打印 上一主题 下一主题

[文本处理] awk RS分割 [复制链接]

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
21 [报告]
发表于 2014-09-26 21:24 |只看该作者
学习
  1. $ echo |awk -vRS='{\\\\' '{print RS}'
  2. {\\
复制代码
首先 -vRS='{\\\\' 会将 {\\存进RS
然后awk又是用正则的眼光看RS,于是{\\被最终翻译成{\,即awk用{\作为行分割符。

至于3斜杠也可以
  1. $ echo |awk -vRS='{\\\' '{print RS}'
  2. {\\
复制代码
确实是这种写法也可以让RS得到{\\

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
22 [报告]
发表于 2014-09-28 11:34 |只看该作者
@blackold回复 21# cao627


    最头疼反斜杠的转义了,目前需要转义反斜杠的时候,一律先在环境里面执行一把再写代码。。。

   之前就没注意过,``和$()两种方式,对于转义的处理是不一样的=。=
  1. a='c:\tmp'
  2. echo $a|sed 's/\\/&&/g'
  3. c:\\tmp
  4. b=`echo $a|sed 's/\\/&&/g'`;echo $b
  5. sed: -e expression #1, char 8: unterminated `s' command
  6. b=`echo $a|sed 's/\\\\/&&/g'`;echo $b
  7. c:\\tmp
  8. b=$(echo $a|sed 's/\\\\/&&/g');echo $b
  9. c:\tmp
  10. b=$(echo $a|sed 's/\\/&&/g');echo $b
  11. c:\\tmp
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
23 [报告]
发表于 2014-09-28 16:33 |只看该作者
学习
  1. czj@sun:/tmp$ echo 'a\\b'
  2. a\\b
  3. czj@sun:/tmp$ echo "a\\b"
  4. a\b
  5. czj@sun:/tmp$ x='a\\b'
  6. czj@sun:/tmp$ echo $x
  7. a\\b
  8. czj@sun:/tmp$ y=`echo 'a\\b'`;echo $y
  9. a\b
复制代码
可见shell遇到``后,``中的单引号不在具有原有的屏蔽shell对其中特殊字符做转意解释的功能了。

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
24 [报告]
发表于 2014-09-28 16:58 |只看该作者
@blackold回复 23# cao627


    应该不是这个原因
  1. a=123;b=`echo '$a'`;echo $b
  2. $a
  3. a=123;b=`echo "$a"`;echo $b
  4. 123
复制代码
我觉得是因为反引号和$()的原理不完全一样
$()是在子进程里面进行处理,然后把结果展示出来,就像cat文本一样,输出的时候是直接打印原值
而反引号毕竟也是引用,在展示输出的时候,又进行了一次解释
  1. y=`echo "a\\b"`;echo $y,${#y}
  2. a\b,3
  3. y=`echo 'a\\b'`;echo $y,${#y}
  4. a\b,3
  5. y=`echo a\\b`;echo $y,${#y}
  6. ab,2
  7. y=$(echo "a\\b");echo $y,${#y}
  8. a\b,3
  9. y=$(echo 'a\\b');echo $y,${#y}
  10. a\\b,4
  11. y=$(echo a\\b);echo $y,${#y}
  12. a\b,3
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
25 [报告]
发表于 2014-09-28 17:20 |只看该作者
回复 19# blackold


   
awk 'BEGIN{RS="...";}

写法就必须写够,一个也不能少。
  1. echo '123\\bc\\d'|awk 'BEGIN{FS="\\\\"}{print NF}'
  2. 5
  3. echo '123\\bc\\d'|awk 'BEGIN{FS="\\\\\\\\"}{print NF}'
  4. 3
  5. echo '123\\bc\\d'|awk 'BEGIN{FS="\\\\\\"}{print NF}'
  6. 1
复制代码
黑哥,如果是用了6个反斜杠,这个会被转义成什么呢?为啥6个的时候NF=1?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
26 [报告]
发表于 2014-09-28 19:10 |只看该作者
你6 个反斜的话FS的到的是\\\
然后awk解释\\\
解释的结果即不是\    ,也不是 \\

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
27 [报告]
发表于 2014-09-28 19:17 |只看该作者
在展示输出的时候,又进行了一次解释
  1. czj@sun:/tmp$ echo "a\\b"
  2. a\b
  3. czj@sun:/tmp$ echo a\\b
  4. a\b
  5. czj@sun:/tmp$y=`echo "a\\b"`;echo $y,${#y}
  6. a\b,3
  7. czj@sun:/tmp$ y=`echo a\\b`;echo $y,${#y}
  8. ab,2
复制代码
既然 echo "a\\b" echo a\\b的结果相同
那么,`echo "a\\b"``echo a\\b` 展示的结果也是一样的,一样的结果shell再次解释,赋值给y,y得到的结果也应该一样。但为什么么不同呢?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
28 [报告]
发表于 2014-09-28 22:28 |只看该作者
回复 25# bulletmarquis


    经过 awk 字符串解释后,FS的值为 '\\\', 这应该是个不规范的正则——有一个"落单"的尾\. 尾\会匹配什么? 没有定义。
对于 grep 会出错, awk 的话,我的环境会匹配null字符。

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
29 [报告]
发表于 2014-09-29 08:48 |只看该作者
回复 27# cao627


    囧了个囧,这个问题真是回答不上来。。。

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
30 [报告]
发表于 2014-09-29 08:48 |只看该作者
回复 28# blackold


    黑哥给力~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP