Bash 从字符串中获取标记,直到它们在shell脚本中耗尽为止

Bash 从字符串中获取标记,直到它们在shell脚本中耗尽为止,bash,shell,Bash,Shell,我有一个shell脚本,它从stdin读取输入字符串,只从输入中获取部分值。输入字符串可以有任意数量的键/值对,格式如下: {"input0":"name:/data/name0.csv", "input1":"name:/data/name1.csv", ....} 因此,在上面的示例中,我希望将这些作为脚本的输出: /data/name0.csv /data/name1.csv ..... 我想我需要两个while循环,一个需要保持从stdin读取,另一个需要从输入中提取值,直到没有

我有一个shell脚本,它从stdin读取输入字符串,只从输入中获取部分值。输入字符串可以有任意数量的键/值对,格式如下:

{"input0":"name:/data/name0.csv",
 "input1":"name:/data/name1.csv",
 ....}
因此,在上面的示例中,我希望将这些作为脚本的输出:

/data/name0.csv
/data/name1.csv
.....
我想我需要两个while循环,一个需要保持从stdin读取,另一个需要从输入中提取值,直到没有更多。有人能告诉我如何做第二个循环块吗?

如果有

{"input0":"name:/data/name0.csv",
    "input1":"name:/data/name1.csv",
    ....}
在文件
abc.in
中,您可以使用名为sed的命令执行以下操作来解析输入:

cat abc.in | sed 's/.*"input[0-9]\+":"name:\(\/data\/name[0-9]\+.csv\)".*$/\1/g'
它基本上是用正则表达式查找当前行,然后查看它是否匹配行开头的表单之一,然后是任何“输入和一个数字”:“name:/data/name和一个数字.csv”任何表单,然后是行的结尾。 结果是:

/data/name1.csv
/data/name2.csv
/data/name3.csv
/data/name4.csv
...
如果你有

{"input0":"name:/data/name0.csv",
    "input1":"name:/data/name1.csv",
    ....}
在文件
abc.in
中,您可以使用名为sed的命令执行以下操作来解析输入:

cat abc.in | sed 's/.*"input[0-9]\+":"name:\(\/data\/name[0-9]\+.csv\)".*$/\1/g'
它基本上是用正则表达式查找当前行,然后查看它是否匹配行开头的表单之一,然后是任何“输入和一个数字”:“name:/data/name和一个数字.csv”任何表单,然后是行的结尾。 结果是:

/data/name1.csv
/data/name2.csv
/data/name3.csv
/data/name4.csv
...
这里有一个简单的循环,将字符串预处理为面向行的内容:

while read -r value; do
  echo "${value#name:}"
done < <(jq -r '.[]')

如果您真的想用脆弱的方式来做事情,而不是利用JSON解析器,您也可以这样做:

# This is evil: Will fail very badly if input formatting changes
content_re='"name:(.*)"'
while read -r line; do
  [[ $line =~ $content_re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
done
仍然不需要内部循环——只需要在输入行上迭代一个循环,由主体决定如何处理每行。

这里有一个简单的循环,将字符串预处理为面向行的内容:

while read -r value; do
  echo "${value#name:}"
done < <(jq -r '.[]')

如果您真的想用脆弱的方式来做事情,而不是利用JSON解析器,您也可以这样做:

# This is evil: Will fail very badly if input formatting changes
content_re='"name:(.*)"'
while read -r line; do
  [[ $line =~ $content_re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
done

仍然不需要内部循环——只需要在输入行上迭代一个循环,由主体决定如何处理每行。

如果您的输入是JSON,是否有理由不使用JSON感知工具(如
jq
)来解析它?这将使您的脚本对输入中的格式更改更加健壮。如果您的输入是JSON,您是否有理由不使用JSON感知工具(如
jq
)来解析它?这将使您的脚本对输入中的格式更改更加健壮。没问题,我很高兴它有帮助:)这真的是您想要的吗?没问题,我很高兴它有帮助:)这真的是您想要的吗?