2017-10-06 102 views
1

我有多个文本文件,其中定义了参数。参数将采用{{env.parameter_name}}的形式。我需要使用bash脚本跟他们做下面的事情。如何查找和打印文件中的所有参数?

  1. 查找文件中的所有参数。
  2. 打印参数名称。

什么是最好的方法?

我输入文件看起来像下面

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <host value="{{env.host}}" /> 
    <port value="{{env.port}}" /> 
</config> 

而且我想我的输出是这样

{{env.host}} 
{{env.port}} 
+0

最好的使用'egrep'命令与正则表达式类似'egrep“{{env \ .. *?}}”fileName.txt' – SMA

+0

@SMA egrep不知道非贪婪匹配,这是一个PCRE构造。 –

+1

使用适当的XML分析器代替文本处理工具,比如'Awk'或'sed',你可以安装'xmllint'吗? – Inian

回答

1

继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 
+1

嗨Ravinder,这有帮助!但我希望输出看起来像问题中的预期输出。我做了很少的编辑来添加输入文件。谢谢! –

+0

是的,我需要确切的参数名称。 –

+0

@DunithDhanushka,请你现在就试试我的编辑,让我知道这是否有助于你? – RavinderSingh13

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
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}} 
+0

这个看起来更清洁! –

+1

@DunithDhanushka:另见grep –

相关问题