免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助!除了循环,如何获取数组元素下标 [复制链接]

论坛徽章:
2
2015亚冠之德黑兰石油
日期:2015-05-26 13:52:28程序设计版块每日发帖之星
日期:2015-06-09 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-10 18:07 |只看该作者 |倒序浏览
考虑单个数组元素中存在空格,特殊字符。
  1. a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")
复制代码
如何通过字符串搜索方式判断是否存在完全匹配的元素

比如

  1. value="ab c"
  2. set | grep -E "^a=\(" | grep -oP "(?<=\[)\d+(?=\]=\"$value\")"
复制代码
就可以得到,ab c 的下标。
但是这对于一些特殊元素不行
比如
  1. value=\"
复制代码
就无法获得 11
请问有什么通用方法吗?

论坛徽章:
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
2 [报告]
发表于 2015-06-11 05:42 |只看该作者
echo '[11]="\""' | grep '\\"'
[11]="\""


echo 'a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")' | grep -E "^a=\(" | grep -oP "(?<=\[)\d+(?=\]=\"\\\\$value\")"
11


不知道到楼主什么意图。

论坛徽章:
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
3 [报告]
发表于 2015-06-11 06:14 |只看该作者
如果将a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")作为字符串来看待  \" 就是字面字符
如果将a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")作为shell语句来看待\" 才表示用"
从你用grep的正则匹配来看,你是将a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")作为字符串来看待的
但又混淆着将a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")作为一条shell语句来看了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2015-06-11 07:36 |只看该作者
回复 1# raps


$ a=([5]="[" [7]="ab c" [8]="[5]=" [11]="\"" [13]="aab cc" [14]="ms dos" [16]="(\"/\")")

$ value=\"

$ VALUE=`echo $value | sed 's/"/\\\\\\\\\\\\&/g;s/[][()]/\\\\&/g'`

$ set | grep -E "^a=\(" | grep -oP "(?<=\[)\d+(?=\]=\"$VALUE\")"
11

$ value="[5]="

$ VALUE=`echo $value | sed 's/"/\\\\\\\\\\\\&/g;s/[][()]/\\\\&/g'`

$ set | grep -E "^a=\(" | grep -oP "(?<=\[)\d+(?=\]=\"$VALUE\")"
8

   

论坛徽章:
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
5 [报告]
发表于 2015-06-11 08:37 |只看该作者
回复 1# raps


grep -oP "(?<=\[)\d+(?=\]=\"\Q$value\E\")"

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
6 [报告]
发表于 2015-06-11 10:41 |只看该作者
回复 5# ly5066113
ly大师,能否解释下这里\Q  \E是什么意思


   

论坛徽章:
2
2015亚冠之德黑兰石油
日期:2015-05-26 13:52:28程序设计版块每日发帖之星
日期:2015-06-09 22:20:00
7 [报告]
发表于 2015-06-11 11:19 |只看该作者
本帖最后由 raps 于 2015-06-11 11:37 编辑

回复 5# ly5066113


    学习了,都是非常牛的用法
    貌似 双引号还是要加上 \
  1. VALUE=`sed 's/"/\\\&/g' <<< "$VALUE"`
复制代码
在数组中 " 无法直接显示,不像 [()] 之类的符号

论坛徽章:
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 [报告]
发表于 2015-06-11 11:31 |只看该作者
回复 6# 聆雨淋夜


    Perl正则, \Q...\E 是一种引用(即关闭元字符的特殊含义)方法,引用模式元字符直到\E。

论坛徽章:
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
9 [报告]
发表于 2015-06-11 11:35 |只看该作者
回复 6# 聆雨淋夜


    \Q 开始对模式元字符强奸,到\E强奸完毕,松开。

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
10 [报告]
发表于 2015-06-11 12:49 |只看该作者
回复 9# blackold
多谢黑哥

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP