从shell脚本中的字符串中提取多个子字符串

时间:2015-05-21 13:45:20

标签: regex bash shell

我有一个文件,其中包含另一个表单命令的输出:

aaaaaaaa   (paramA 12.4)   param2: 14,   some text   25.55
bbbbbb    (paramA 5.1)   param2: 121,   some text2    312.1

我想从第一行中选择值aaaaaaaa, 12.4, 14, 25.55,从第2行中选择bbbbbb, 5.1, 121, 312.1,依此类推,并以不同的格式(可能是csv)转储它们。

我想在某些命令(sed,awk,grep等)中使用正则表达式,并将匹配的模式指定为$1$2等,以便我可以将它们转储为所需的格式。

我不清楚的是要为此学习哪个命令。在搜索时,sed,awk,grep似乎能够做到这一点,但我无法得到现成的答案。我计划学习这些命令,但是我从什么开始解决手头的问题呢?

2 个答案:

答案 0 :(得分:1)

对于完全相同的输入,您可以使用

apply()

产生

awk -F' +|)|,' -vOFS=", " '{print $1, $3, $6,$10}' file

但是,如果您在最后一个字段中有多于或少于两个单词,或者如果您在其他字段中有多个单词,则会失败。

否则,您必须查找数字并将其与文本区分开来,或者您需要更好地表征您的输入(固定,制表符分隔或基于某些正则表达式与sed)。

答案 1 :(得分:0)

您可以在bash

中执行此操作
# Not tested; regex may not be entirely correct.
regex='(.*) +\(paramA (.*)\) +params: (.*), +.* +(.*)'
while IFS= read -r line; do
    [[ $line =~ $regex ]] || continue
    # Captured groups are:
    # ${BASH_REMATCH[1]} - aaaaaaaa
    # ${BASH_REMATCH[2]} - 12.4
    # ${BASH_REMATCH[3]} - 14
    # ${BASH_REMATCH[4]} - 25.55
done < file.txt

然而,它会相对缓慢。使用像awk这样的其他工具可能会更有效率。但是,这完全取决于您实际想要对提取的文本执行的操作。