如何查找和打印文件中的所有参数?
我有多个文本文件,其中定义了参数。参数将采用{{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}}
继AWK可以帮助你在同一个,因为你还没有显示出任何样品INPUT_FILE (s)所以没有测试它,请尝试一下,然后让我知道。
awk 'FNR==1{if(val){print RS "*******";close(val)};print "*******" RS FILENAME;val=FILENAME;} /{{.*}}/' *.txt
应该打印的文件名,然后将所有参数,如 - >
*******
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
嗨Ravinder,这有帮助!但我希望输出看起来像问题中的预期输出。我做了很少的编辑来添加输入文件。谢谢! –
是的,我需要确切的参数名称。 –
@DunithDhanushka,请你现在就试试我的编辑,让我知道这是否有助于你? – RavinderSingh13
随着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
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}}
这个看起来更清洁! –
@DunithDhanushka:另见grep –
最好的使用'egrep'命令与正则表达式类似'egrep“{{env \ .. *?}}”fileName.txt' – SMA
@SMA egrep不知道非贪婪匹配,这是一个PCRE构造。 –
使用适当的XML分析器代替文本处理工具,比如'Awk'或'sed',你可以安装'xmllint'吗? – Inian