免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4881 | 回复: 10
打印 上一主题 下一主题

[文本处理] echo (aa) 时 报syntax error near unexpected token '(' [复制链接]

论坛徽章:
1
狮子座
日期:2014-03-27 12:53:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-21 16:47 |只看该作者 |倒序浏览
>echo AA(bb) 【error】
syntax error near unexpected token '('

>echo "AA(bb)" 【pass】
AA(bb)

但是我有一个命令输出结果为这种带括号的,但又不能加双引号,否则命令就不被执行,但我还得去掉这个字符串中的括号,请问,如何解决这个问题??
比如从file中返回这个字符串AA(BB)

>grep AA file |  sed 's/\(*//' 【不行】
AA(BB)
>grep AA file | awk '{print $1}' 【可行】
AA

为什么一定需要把带有括号的字符串放到文件中,才能被使用??为什么sed不能处理带括号的而awk却可以??

谢谢

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2013-02-21 17:08 |只看该作者
把你具体的数据和期望结果贴出来吧,你所有的为什么都有同一个原因:就这么约定的

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2013-02-21 18:27 |只看该作者
  1. grep AA urfile |  sed 's/(\|)//g'
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
4 [报告]
发表于 2013-02-21 21:58 |只看该作者
我也只看懂一个问题,sed加一个-r参数就可以了。楼主还是把要求写详细点吧。。
  1. echo 'AA(bb)' | sed -r 's/\(|\)//g'
复制代码

论坛徽章:
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
5 [报告]
发表于 2013-02-22 09:08 |只看该作者
看不懂LZ的问题。

论坛徽章:
0
6 [报告]
发表于 2013-02-22 09:11 |只看该作者
提问的智慧。。。。。。。。。

论坛徽章:
1
狮子座
日期:2014-03-27 12:53:15
7 [报告]
发表于 2013-02-22 09:59 |只看该作者
回复 4# nathanielwen


    sorry,我并没有把问题说明白。  我的问题是,
1. 为什么
>echo AA (BB)
的时候会出错, 但
>echo "AA (BB)"却可以??

2. 我有一个字符串AA (BB),【AA 后面有个空格】如何把空格及其后的(BB)去掉??
>echo "AA (BB)" | awk ’{print $1}‘ 这个是我想到的,
>echo "AA (BB)" | sed -r 's/\(.*//' 这个按照你的思路来的
>echo "AA (BB)" | sed -r 's/[(].*//g' 这个是别人给的
以上都可以得到 AA的输出结果。

之前,我的问题是,问什么sed不能work,原来是我忘记了.点号,正则表达式在perl,sed中的语法原来是一样的,之前没有看到sed的正则表达式。

谢谢

论坛徽章:
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
8 [报告]
发表于 2013-02-22 10:23 |只看该作者
回复 7# ciedecem


    1. 为什么
>echo AA (BB)
的时候会出错, 但
>echo "AA (BB)"却可以??


因为 shell 语法就这么规则的。()是特殊字符,要引用。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
9 [报告]
发表于 2013-02-22 10:26 |只看该作者
回复 7# ciedecem
  1. echo "AA (BB)" | sed 's/(.*//'
复制代码
  1. echo "AA (BB)" | sed 's/ .*//'
复制代码

论坛徽章:
1
狮子座
日期:2014-03-27 12:53:15
10 [报告]
发表于 2013-02-22 12:19 |只看该作者
回复 8# blackold


    Actually,论坛中有过类似的讨论,
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3765319

即()在shell中会被解析为命令,而$(cmd)就是引用命令的结果,然后可以赋值。
>(date)
Fri Feb 22 12:16:54 HKT 2013
>echo (date)

>echo (date)
-bash: syntax error near unexpected token `date'

>echo $(date)
Fri Feb 22 12:17:21 HKT 2013

因此,倘若在shell脚本中执行一条命令,比如
#!/bin/sh

echo "template_nrt_plugin-1.0.0.175700 (rhel)" |awk '{print $1 }'

那么,上面命令的执行结果,与将其用()括起来的结果是一样的。
#!/bin/sh

(echo "template_nrt_plugin-1.0.0.175700 (rhel)" |awk '{print $1 }')

至此,我的问题解决了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP