【问题标题】:Bash extract strings between two charactersBash 提取两个字符之间的字符串
【发布时间】:2020-10-15 10:15:14
【问题描述】:

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

-------------------------------- | NAME | TEST_DATE | ----------------
--------------------- | TESTTT_1 | 2019-01-15 | | TEST_2 | 2018-02-16 | | TEST_NAME_3 | 2020-03-17 | -------------------------------------

我想忽略列名(NAME | TEST_DATE) 并将每个名称和 test_date 的实际值存储为数组中的元组。 所以这是我在想的逻辑,我想在两个'|'之间提取第三个字符串人物。这些字符串以逗号分隔,当遇到空格时,我们开始数组中的下一个元组。

预期输出:

array=(TESTTT_1,2019-01-15 TEST_2,2018-02-16 TEST_NAME_3,2020-03-17)

感谢任何帮助。谢谢。

【问题讨论】:

  • 不清楚为什么NAME,TEST_DATE 不在结果中。另外,你有什么尝试,请在这里放一些代码......
  • @Luuk 我已经编辑了这个问题以使其现在更清楚,也使用了我拥有的部分输出。我正在尝试使用 awk -F "|" 来实现这一点'{print $5}' 但不清楚如何循环 $5 以后的所有字符串。我也在使用 if [[ "$a" =~ [A-Za-z0-9] ]];然后回显“添加到数组”; elif [[ "$a" =~ [----] ]];然后回显“退出”;菲
  • 从 5 开始打印:awk -F "|" '{ for(i=5; i<=NF; i++){ print $i }}'

标签: bash awk sed text-processing


【解决方案1】:

说说你的 字符串存储在变量 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')

上面将按照您的预期将我们的输入存储在名为数组的变量中 上述命令的输出是:

echo "$array"
TESTTT_1,2019-01-15,TEST_2,2018-02-16,TEST_NAME_3,2020-03-17

命令解释:echo $a 的输出将通过管道传输到 cut 并使用 '|'作为分隔符,它将剪切字段 2,3,5,6,8,9 然后将输出通过管道传输到尾部以删除不需要的 NAME 和 TEST_DATE 列并仅提供值,然后根据您的预期输出 |将使用 sed 转换为 。

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

【讨论】:

  • 返回的 name 和 test_date 元组的数量可能会有所不同。因此循环可能更可取,除非可以按照您建议的方式处理:)
【解决方案2】:
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'

以上是基于 awk 的解决方案

输出:

TESTTT_1, 2019-01-15 TEST_2, 2018-02-16 TEST_NAME_3, 2020-03-17

没事吧。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多