我有多个文本文件,其上定义了参数。参数采用{{env.parameter_name}}的形式。我需要使用bash脚本对它们进行以下操作。
最好的方法是什么?
我的输入文件如下所示
<?xml version="1.0" encoding="UTF-8"?>
<config>
<host value="{{env.host}}" />
<port value="{{env.port}}" />
</config>
我希望我的输出像这样
{{env.host}}
{{env.port}}
答案 0 :(得分:2)
使用xmlstarlet:
xmlstarlet select --template --value-of '//@value' file.xml
或者从file.xml获取所有属性:
xmlstarlet select --template --value-of '//@*' file.xml
在这种情况下,两种情况下的输出:
{{env.host}} {{env.port}}
请参阅:xmlstarlet select --help
答案 1 :(得分:1)
关注awk可能对您有所帮助,因为您还没有显示任何示例Input_file,因此无法对其进行测试,请尝试并让我知道。
awk 'FNR==1{if(val){print RS "*******";close(val)};print "*******" RS FILENAME;val=FILENAME;} /{{.*}}/' *.txt
它应该打印文件名,然后打印所有参数,例如 - &gt;
*******
file1.txt
{{env.parameter_name}}
{{env.other_name}}
*******
*******
file2.txt
{{test_name}}
*******
编辑: 由于OP只需要打印参数,因此以下内容可能有所帮助。
awk 'FNR==1{if(val){close(val)};val=FILENAME;} /{{.*}}/{match($0,/{{.*}}/);print substr($0,RSTART,RLENGTH)}' *.txt
答案 2 :(得分:1)
awk 'match($0,/\{{.*\}}/){print substr($0,RSTART,RLENGTH)}' infile
测试结果:
$ cat infile
<?xml version="1.0" encoding="UTF-8"?>
<config>
<host value="{{env.host}}" />
<port value="{{env.port}}" />
</config>
$ awk 'match($0,/\{{.*\}}/){print substr($0,RSTART,RLENGTH)}' infile
{{env.host}}
{{env.port}}
使用grep:
$ grep -Po '({{(?>([^}}])|(?0))*?}})' file
{{env.host}}
{{env.port}}
如果您有多个值,如下所示
$ cat file
<?xml version="1.0" encoding="UTF-8"?>
<config>
<host value="{{env.host}}" />
<port value="{{env.port}}{{env.etc}}" />
</config>
$ grep -Po '({{(?>([^}}])|(?0))*?}})' file
{{env.host}}
{{env.port}}
{{env.etc}}