如何在文件中查找和打印所有参数?

时间:2017-10-06 16:11:42

标签: regex bash shell awk sed

我有多个文本文件,其上定义了参数。参数采用{{env.parameter_name}}的形式。我需要使用bash脚本对它们进行以下操作。

  1. 查找文件中的所有参数。
  2. 打印参数名称。
  3. 最好的方法是什么?

    我的输入文件如下所示

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

    我希望我的输出像这样

    {{env.host}}
    {{env.port}}
    

3 个答案:

答案 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}}