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

时间:2015-03-17 21:23:46

标签: regex bash aix

嗨 - 我没有大量的shell脚本编写经验,我需要使用正则表达式(或多个正则表达式)作为分隔符创建一个bash脚本,将单个大音符字段拆分为单个音符数组。我的输入如下:

  

这是第一个音符(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.

我已经定义了两个正则表达式来识别注释标记的开头和结尾,但是我对如何将数据实际放入数组感到茫然。我的正则表达是:

starttag= "\([A-Z0-9]{2}"
endtag= "\d+:\d+[A|P]\)"

我尝试使用IFS创建一个数组,但看起来IFS不能包含多个字符 - 对吗?我的结果似乎是在我的正则表达式中的每个字符上拆分输入,而不是将整个正则表达式作为单个分隔符进行评估。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我的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中。