Bash提取两个字符之间的字符串

Bash提取两个字符之间的字符串,bash,awk,sed,text-processing,Bash,Awk,Sed,Text Processing,我将查询结果输出到一个bash变量中,存储为一行 -------------------------------- | NAME | TEST_DATE | ---------------- --------------------- | TESTTT_1 | 2019-01-15 | | TEST_2 | 2018-02-16 | | TEST_NAME_3 | 2020-03-17 | ------------------------------------- 我希望忽略列namesNAM

我将查询结果输出到一个bash变量中,存储为一行

-------------------------------- | NAME | TEST_DATE | ----------------
--------------------- | TESTTT_1 | 2019-01-15 | | TEST_2 | 2018-02-16 | | TEST_NAME_3 | 2020-03-17 | -------------------------------------
我希望忽略列namesNAME | TEST_DATE,并将每个名称和TEST_DATE的实际值存储为数组中的元组。 这是我想的逻辑,我想提取两个“|”字符之间的第三个字符串。这些字符串以逗号分隔,当遇到空格时,我们开始数组中的下一个元组

预期产出:

array=(TESTTT_1,2019-01-15 TEST_2,2018-02-16 TEST_NAME_3,2020-03-17)
感谢您的帮助。谢谢。

让我说说你的想法 字符串存储在变量a中,或将查询输出传输到下面的命令

echo "$a" 

-------------------------------- | NAME | TEST_DATE | ----------------
--------------------- | TESTTT_1 | 2019-01-15 | | TEST_2 | 2018-02-16 | | TEST_NAME_3 | 2020-03-17 | ------------------------------------
获得所需结果的命令是:

array="$(echo "$a" | cut -d '|' -f2,3,5,6,8,9 | tail -n1 | sed 's/ | /,/g')
如上所述,我们将按照您的预期将ourput存储在名为array的变量中 上述命令的输出为:

echo "$array"
TESTTT_1,2019-01-15,TEST_2,2018-02-16,TEST_NAME_3,2020-03-17
命令说明:echo$a的输出将通过管道传输到cut,并使用“|”作为delimeter,它将剪切字段2、3、5、6、8、9,然后将输出通过管道传输到tail,以删除不需要的名称和TEST_DATE列,并仅提供值,然后根据您的预期输出,使用sed将转换为

在这个字符串中,如果有更多的日期,则只有三个日期,如果有更多的日期,则添加更多字段号,并且根据字符串的格式,字段号将采用以下样式2,3,5,6,8,9,11,12,14,15。。。。等等 希望它解决了你的问题

echo "$a" | awk -F "|" '{ for(i=2; i<=NF; i++){ print $i }}' | sed -e '1,3d' -e '$d' | tr ' ' '\n' | sed '/^$/d' | sed 's/^/,/g' | sed -e 'N;s/\n/ /' | sed 's/^.//g' | xargs | sed 's/ ,/, /g'

可以吗。

不清楚为什么结果中没有名称、测试日期。另外,你尝试了什么,请在这里输入一些代码…@Luuk我已经编辑了这个问题以使其更清楚,同时使用了我的部分输出。我试图使用awk-F |{print$5}实现这一点,但不清楚如何循环所有$5以后的字符串。我还使用if[$a=~[a-Za-z0-9]];然后将echo添加到数组中;elif[$a=~[-]];然后回波退出;fito print from 5 from 5:awk-F |‘{fori=5;返回的名称和测试日期元组的数量可能不同。因此循环可能更可取,除非可以按照您建议的方式处理:
TESTTT_1, 2019-01-15 TEST_2, 2018-02-16 TEST_NAME_3, 2020-03-17