![bash 使用 sed/awk 从文件中获取所需行](https://linux22.com/image/222897/bash%20%E4%BD%BF%E7%94%A8%20sed%2Fawk%20%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E8%8E%B7%E5%8F%96%E6%89%80%E9%9C%80%E8%A1%8C.png)
文件内容如下:
Text1:
text_1: Text1 text_1
text_2:
- text
- file1:\\
- file2:\\
Text2:
text_1: Text2 text_1
text_2:
- text
- file3:\\
Text3:
etc
输出:打印给定 Textn 的“file:\”条目。知道如何在 Linux 中使用 sed/awk 命令来实现这一点。
示例:test.txt 文件内容如下:
$ cat test.txt
Text1:
text_1: Text1 text_1
text_2:
- text
- file1:\\
- file2:\\
Text2:
text_1: Text2 text1
text_2:
- text
- file3:\\
Text3:
etc
按照建议尝试下面的 grep 命令,它会打印 test.txt 文件中的所有“file:\”条目。对于“Text1:”匹配,我需要的只是 file1:\ 和 file2:\ 作为输出,对于“Text2:”仅匹配 file3:\。
答案1
yq
在新更新的 YAML 文件上使用,您可以选择file
如下值
yq '.Text1.text_2[] | select(. == "file*")' file.yaml
输出
file1:\\
file2:\\
如果您希望能够挑选出不同的TextN
值,您可以执行类似的操作来传递适当的键值
for key in Text1 Text2
do
printf 'Key %s:\n' "$key"
yqText="$key" yq 'eval("." + env(yqText) + ".text_2[]") | select(. == "file*")' file.yaml |
while IFS= read -r val
do
printf 'Value: %s\n' "$val"
done
echo
done
如果你还没有yq
安装,你可以自己从 Github 仓库安装https://github.com/mikefarah/yq,或者如果它用于托管环境,请询问您的变更委员会。