免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cookis
打印 上一主题 下一主题

sed 如何得到匹配项的最后一行? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-12-18 13:21 |只看该作者
呵呵,恭喜,你的问题已经解决了

论坛徽章:
0
32 [报告]
发表于 2007-12-18 13:25 |只看该作者
原帖由 ly5066113 于 2007-12-18 13:12 发表


\不是用来转意/的,是因为你匹配的内容的最后一个字符是\


呵呵,一开始我也没看明白,忘了第一个sed输出结果是 "... \"

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2007-12-18 13:31 |只看该作者
不是..

我单独 把sed -n '/cpp  \\/h;${g;p;}' makefile 提出来 执行了一下..
$ echo $(sed -n '/cpp  \\/h;${g;p;}' makefile)
xml_parser.cpp \
它匹配到的是整行..所以后边不用加 \\

论坛徽章:
0
34 [报告]
发表于 2007-12-18 13:39 |只看该作者
原帖由 cookis 于 2007-12-18 13:31 发表
不是..

我单独 把sed -n '/cpp  \\/h;${g;p;}' makefile 提出来 执行了一下..
$ echo $(sed -n '/cpp  \\/h;${g;p;}' makefile)
xml_parser.cpp \
它匹配到的是整行..所以后边不用加 \\


没错,但是你的 "xml_parser.cpp \" 这个字符串是要放到 sed 里面去,sed会认为 \ 是转移符号,而不是字符"\",
所以你还要手工再加一个 \ ,  就负负得正了

换句话说,\ 不是用来转义后面的 / , 而是用来被前面的 \ 转义的

[ 本帖最后由 seeLnd 于 2007-12-18 13:51 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
35 [报告]
发表于 2007-12-18 13:50 |只看该作者
但这样会有语法错误..
]$ sed "/$(sed -n '/cpp  \\/h;${g;p;}' makefile)\/s/\\\//" makefile
sed: -e expression #1, char 26: unknown command: `\'

我想它会不会把 sed "/$(sed -n '/cpp  \\/h;${g;p;}' makefile)\/s/\\\//" makefile
                                                                                          ^ 它不会把后边的/给转义掉?

论坛徽章:
0
36 [报告]
发表于 2007-12-18 13:54 |只看该作者
我这里没有语法错误的, 相反没有加 \ ,才会出现你上述的错误
不会的,你看 sed -n '/cpp  \\/h;${g;p;}' 就知道了,第二个\已经事先会被第一个\转义的,就成为普通字符,不具有转义后面 / 的能力

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2007-12-18 13:57 |只看该作者
那怪了..我这里一直有问题...

sed 执行的时候不预先解释一下语句吗? 如果按你的说法.应该没问题..但如果sed 预先解释的话..它是得不到子过程sed 得到的"\"  所以我标记处的 \ 也不会被转义..相反它会去转义其他字符.

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
38 [报告]
发表于 2007-12-18 13:59 |只看该作者
是呀,我和seeLnd兄的测试结果一样,不加\才会抱错的。
是不是你的真实数据里面,含\的最后一行\后面还有其他字符?如空格,TAB什么的?

论坛徽章:
0
39 [报告]
发表于 2007-12-18 14:04 |只看该作者
shell会预先执行 $(command), 所以此时外层的sed还未被执行,就不存在预先解释了, 等到开始执行外层sed, 那么那时字符串已经都被shell生成好了, 你如果不加\, 执行会报什么错?

论坛徽章:
0
40 [报告]
发表于 2007-12-18 14:06 |只看该作者
原帖由 ly5066113 于 2007-12-18 13:59 发表
是呀,我和seeLnd兄的测试结果一样,不加\才会抱错的。
是不是你的真实数据里面,含\的最后一行\后面还有其他字符?如空格,TAB什么的?


有道理,佩服,很有可能是这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP