Regex Bash脚本使用多字符分隔符的正则表达式将字段拆分为数组

Regex Bash脚本使用多字符分隔符的正则表达式将字段拆分为数组,regex,bash,aix,Regex,Bash,Aix,您好–我没有太多的shell脚本编写经验,我需要创建一个bash脚本,使用一个正则表达式(或多个正则表达式)作为分隔符,将单个大型注释字段拆分为单个注释数组。我的输入如下所示: This is the first note AA 01/23 10:00A This is the second note AB 01/24 11:00P This is the third note C1 01/25/2015 12:

您好–我没有太多的shell脚本编写经验,我需要创建一个bash脚本,使用一个正则表达式(或多个正则表达式)作为分隔符,将单个大型注释字段拆分为单个注释数组。我的输入如下所示:

This is the first note          AA  01/23       10:00A
This is the second note         AB  01/24       11:00P
This is the third note          C1  01/25/2015  12:15A
This is the fourth (and final) note D2  03/10       03:15P
这是第一个音符(AA 01/23 10:00A)这是第二个音符(AB 01/24 11:00P)这是第三个音符(C101/25/201512:15A)这是第四个(也是最后一个)音符(D2 03/10 03:15P)

我的阵列需要如下所示:

This is the first note          AA  01/23       10:00A
This is the second note         AB  01/24       11:00P
This is the third note          C1  01/25/2015  12:15A
This is the fourth (and final) note D2  03/10       03:15P
详情:

  • 注释可以包含括号,因此我认为我需要使用正则表达式,而不是在每个括号后面拆分“”
  • 注释“标记”(括号中包含的部分)中的日期可以有两种不同的格式–一些日期前后有空格,只有mm/dd日期,而另一些日期显示为mm/dd/yyyy,前后没有空格
  • 注释标记始终以“(AA)”开头,其中AA可以是大写字母和数字字符的任意组合
  • 注释标记始终以“HH:MMA”结尾,其中HH是有效的小时,MM是有效的分钟,并且)前面的最后一个字符是A或P
我已经定义了两个正则表达式来标识note标记的开始和结束,但是我不知道如何将数据实际放入数组中。我的正则表达式是:

starttag= "\([A-Z0-9]{2}"
endtag= "\d+:\d+[A|P]\)"
我尝试使用IFS创建数组,但IFS似乎不能包含多个字符-对吗?我的结果似乎是分割正则表达式中每个字符的输入,而不是将整个正则表达式作为单个分隔符进行计算


任何帮助都将不胜感激。

我的sed不是最好的,这看起来有点傻,而且没有任何保证:

    eval $(sed 's/\([^()]*\)(\([A-Z0-9]\{2\}\)\([^AP]*[AP]\)) */\1 \2 \3" "/g ; s/\([^ ]\)\([0-9]\{2\}:[0-9]\{2\}[AP]\)/\1 \2/g ; s/ "$//g ; s/^.*/array=("&)/' file)
将“array”更改为要命名的数组的名称,将“file”更改为输入文件的名称。通过测试输入,sed行将扩展为:

array=("This is the first note  AA  01/23 10:00A" "This is the second note AB  01/24 11:00P" "This is the third note  C1 01/25/2015 12:15A" "This is the fourth (and final) note D2  03/10 03:15P")

eval会将其拾取并扩展到当前正在运行的shell中。

是否希望从中获得2D数组?Bash主要只支持1D数组。不,只支持1D数组。最终目标是为与订单关联的每个注释创建数据库加载记录。因此,带有order#/note的传入记录将作为单独的记录order#/note,order#/note,order#note写入文件。对于类似的内容,我建议查看
grep
awk
sed
。您可以使用grep搜索regex并返回它找到的内容
egrep
grep-e
grep-P
对于您的目标应该是最有用的。是否应将“这是第一个注释”作为数组元素的索引,将“AA 01/23 10:00A”作为值?感谢您的建议。。我尝试了这个方法,但是我需要评估的传入数据是一个较大记录中的单个字段,而且sed似乎不喜欢这样。以下是我尝试过的:'eval$(sed's/([^()]*)([A-Z0-9]\{2})([^AP]*[AP])*/\1\2\3”“/g;s/([^])([0-9]\{2\}:[0-9]\{2\}[AP])/\1\2/g;s/“$///g;s/.*/notes=(“&”)我知道它似乎适用于您的示例数据。很抱歉,它不适用于您的真实数据。