我想匹配一个模式,并在该模式匹配后完全选择下一行。我在file1中输入以下内容的文件:
{
"lotsoftext": [
........
],
{
"Key": "Envvi",
"Value": "model"
},
{
"Key": "Department",
"Value": "Sys"
}
{
"Key": "Subdept",
"Value": "io"
},
}
....
我想要输出像在单独的文件file2中一样 something_model-Sys
"Key": "Envvi","Key": "Department"
->在所有文件中保持不变,但是值不断变化。一次可能是Sys,有时可能是Fin,等等。我只需要模式匹配"Key": "Envvi"
和"Key": "Department"
下面的行。在最终输出中,我在前面加上“ _”,然后加上下划线“ _”,然后在Department中的Ennvi连字符值中添加值。我用awk管理了一些内容以删除行,但无法匹配我想要的内容。对我来说,这看起来太复杂了。任何帮助请
答案 0 :(得分:0)
答案1:
egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {print tolower($2)}' | sed -e 's/[" ]//g' -e 's/-$/\n/' -e 's/^/aws_/'
输入:cat example_1.txt
{
"Key": "Envvi",
"Value": "model"
},
{
"Key": "Department",
"Value": "Sys"
}
{
"Key": "Subdept",
"Value": "io"
}
输出:
something_model-sys
添加更多说明:
1)egrep -A 1“环境|部门” example_1.txt->这将搜索所需的键值,并在匹配(-A 1)之后打印该行和一行。仅此第一步的输出如下:
"Key": "Envvi",
"Value": "model"
--
"Key": "Department",
"Value": "Sys"
2)awk -F:-v ORS =“-”'/ Value / {print tolower($ 2)}'->这将从上一个输出中找到“值”对,并使用“:”打印第二个字段字段分隔符。 tolower()用于小写输出。以下是此步骤的输出。请注意,由于ORS设置为“-”,因此末尾没有换行符。
"model"- "sys"-
3)sed -e's / [“] // g'->此部分从上一步获取输入,并删除所有出现的双引号和空格,以下是此步骤之后的输出。最后仍然没有换行符。
model-sys-
4)'s /-$ / \ n /'-> sed的第二部分采用上一步的输入,并用换行符替换最后出现的hypen(-)。以下是此步骤之后的输出。请注意,现在结尾处有换行符。
model-sys
5)'s / ^ / aws_ /'-> sed的最后一部分采用上一步的输入,并将“ aws_”字符串添加到该行的开头。
aws_model-sys
在GNU AWK(使用gsub)中工作的Answer 1的进一步改进/简化版本:
egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {gsub(/[" ]/,"",$2); print tolower($2)}' | sed -e 's/-$/\n/' -e 's/^/aws_/'
答案 1 :(得分:0)
如果'd'文件中的数据是通过gnu sed
sed -En '/\s*"Key":\s*"Envvi"|\s*"Key":\s*"Department"/{n;p}' d