【问题标题】:Linux shell, get all the matches from a file [duplicate]Linux shell,从文件中获取所有匹配项[重复]
【发布时间】:2013-08-24 09:53:01
【问题描述】:

我有一个类似以下格式的文件:

line one  
line two <% word1  %> text <% word2 %>  
line three <%word3%>  

我想使用 awk、sed 等 linux shell 工具来获取
中引用的所有单词 结果应该是这样的

word1  
word2  
word3  

感谢您的帮助。

我忘了说:我在嵌入式环境中。 grep 没有 -P 选项

【问题讨论】:

    标签: linux shell sed awk


    【解决方案1】:

    使用 GNU awk,我们可以 RS 到多个字符:

    $ gawk -v RS='<% *| *%>' '!(NR%2)' file
    word1
    word2
    word3
    

    使用任何现代 awk:

    $ awk -F'<% *| *%>' '{for (i=2;i<=NF;i+=2) print $i}' file
    word1
    word2
    word3
    

    【讨论】:

    • 太漂亮了!
    【解决方案2】:

    使用 awk:

    awk -F '<% *| *%>' '{for(i=2; i<=NF; i+=2) print $i}' file
    word1
    word2
    word3
    

    【讨论】:

      【解决方案3】:

      你可以用 grep 来做:

      $ grep -oP '(?<=<%).+?(?=%>)' file
       word1  
       word2 
      word3
      

      【讨论】:

      • 谢谢!忘了提,我在嵌入式环境中。 grep 没有 -P 选项
      【解决方案4】:

      这适用于您的示例:

      sed -ne 's/%>/&\n/p' | sed -ne 's/.*<%\s*\(.*\)\s*%>.*/\1/p' < sample.txt
      

      第一个sed只是在每次关闭%&gt;之后换一个换行符,作为准备。

      下一个sed 提取&lt;% ... %&gt; 中的相关部分,没有前导和尾随空格。

      在这两个命令中,-n 标志与s///p 结合使用将通过管道的数据限制为仅匹配(相关)行。

      【讨论】:

      • 谢谢。这很完美。
      • 请注意上面有 2 个不可移植的 sed 构造:a) 使用 \n 作为换行符(反斜杠后跟文字回车是可移植的)和 b) 使用 @987654329 @ 表示空格字符([[:blank:]] 是 POSIX,但在这种情况下,文字空白字符可能就足够了)。当你的 grep 不支持 -P 时,我很惊讶你的 sed 能与那些人一起工作。
      【解决方案5】:

      这可能对你有用(GNU sed):

      sed '/<%\s*/!d;s//\n/;s/[^\n]*\n//;s/\s*%>/\n/;P;D' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多