我有一个具有以下值的文件:
猫数据.txt
server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'
_TRGT_
我得到包含ie LIB_TRGT_calv,anot
& 的变量LIB_TRGT_secd
注意:变量的名称可能不同,例如DB_TRGT_<whatever>
_TRGT_
我需要从上面的变量 iecalv,anot
和 中获取之后的名称secd
。
考虑到我们得到了calv & anot & secd
;我现在需要获取所有具有calv
& anot
&的条目secd
,并将这些找到的条目添加到 data.txt 中,如下所示:
期望的输出:
server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'
LIB_server1: '/tmp/hello.txt'
LIB_server2: '/tmp/hello.txt'
LIB_server3: '/tmp/hello.txt'
LIB_server4: '/tmp/hello.txt'
LIB_server6: '/tmp/hello.txt'
LIB_server5: '/var/del.tmp'
以下是我到目前为止所做的:
grep TRGT* data.txt | cut -d: -f1 |cut -d_ -f3
calv,anot
secd
更远
grep TRGT* test.txt | cut -d: -f1 |cut -d_ -f3 | sed -n 1'p' | tr ',' '\n'
calv
anot
我不知道如何使用xargs
并进一步进行它。
答案1
由于这是 YAML,我会使用 YAML 解析器,例如yq
来自https://kislyuk.github.io/yq/
给定输入数据file
和一个简短的脚本script
:
$ yq -y -f script file
server1: calv
server2: anot
log: /u/log/1
server3: calv
server4: anot
server5: secd
server6: calv
LIB_TRGT_calv,anot: /tmp/hello.txt
LIB_TRGT_secd: /var/del.tmp
LIB_server1: /tmp/hello.txt
LIB_server2: /tmp/hello.txt
LIB_server3: /tmp/hello.txt
LIB_server4: /tmp/hello.txt
LIB_server5: /var/del.tmp
LIB_server6: /tmp/hello.txt
这是使用以下jq
脚本完成的(yq
是 JSON 解析器的 YAML 包装器jq
):
with_entries(
select(.key | test("_TRGT_")) |
.value as $v |
.key | sub(".*_TRGT_"; "") | split(",")[] |
{ key: ., value: $v }
) as $map |
. += with_entries(
select(.value | in($map)) |
{ key: ("LIB_" + .key), value: $map[.value] }
)
首先计算 JSON 对象$map
,根据问题中的数据,该对象将是从_TRGT_
原始数据中的键解析出的特殊键值与路径名之间的简单映射:
{
"calv": "/tmp/hello.txt",
"anot": "/tmp/hello.txt",
"secd": "/var/del.tmp"
}
对于原始数据中与该$map
对象中的键相对应的每个值,将使用根据值的键计算出的键以及从 中相应条目中获取的值来创建一个新条目$map
。