【问题标题】:How to find and print all parameters in files?如何查找和打印文件中的所有参数?
【发布时间】:2017-10-06 16:11:41
【问题描述】:

我有多个文本文件,其中定义了参数。参数将采用 {{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}}

【问题讨论】:

  • 最好使用egrep 命令与正则表达式类似egrep "{{env\..*?}}" fileName.txt
  • @SMA egrep 不知道非贪婪匹配,这是一个 PCRE 构造。
  • 使用正确的XML解析器代替Awksed等文本处理工具,你能安装xmllint吗?
  • 如果您的字符串 {{...}} 可以在 1 行出现两次,则将其包含在您的示例中,因为它需要与仅出现一次不同的解决方案。如果{{}} 可以在其他上下文中出现,则同上。

标签: regex bash shell awk sed


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

    跟随 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
    

    【讨论】:

    • 嗨拉文德,这有帮助!但我希望输出看起来像问题中的预期输出。我做了一些编辑来添加输入文件。谢谢!
    • 是的,我需要的正是参数名称。
    • @DunithDhanushka,你能不能现在试试我的编辑,如果这对你有帮助,请告诉我?
    • 它在行下打印。 有什么方法可以获得与我发布的输出完全相同的值吗?也许将您的 awk 传递给另一个命令?
    • @DunithDhanushka,嗯,抱歉,现在检查一下,正在执行多任务处理,它现在应该可以工作了,让我知道。
    【解决方案3】:
    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}}
    

    【讨论】:

    • 这个看起来干净多了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多