【问题标题】:Awk/Sed - how to print selection between two patterns?Awk/Sed - 如何在两种模式之间打印选择?
【发布时间】:2013-06-03 08:36:32
【问题描述】:

来自参考:catonmat.net 我想我可以使用以下方法在两种模式之间进行感兴趣的选择:

Source Text (one line): 6 June 2013 08.32.435 UTF+8 Report /content/folder[@name='....' Failure ....

这里重要的部分是报告路径,因此我使用的是:

awk '/content\/folder\[@name=/,/Failure/' source.csv

我得到了整个匹配的行,而不仅仅是两个匹配项之间的内容路径。

我也尝试过:

sed -n '/content\/folder\[@name/,/Failure/ {/content\/folder\[@name\|Failure/!p}' source.csv

仍然返回整行...

出了什么问题?

【问题讨论】:

  • /regexp/,/regexp/ 用于选择要处理的行,而不是选择子字符串。
  • 这两种模式是否总是在同一行,或者起始模式是否与结束模式不同?

标签: bash shell command-line sed awk


【解决方案1】:

试试这个:

sed -n '|content/folder\[@name.*Failure|s|.*content/folder\[@name\(.*\)Failure.*|\1|' source.csv

/re1/,/re2/ 用于选择行范围,而不是行内的文本范围。由于content/folderFailure 在同一行,因此您不需要范围,只需一个匹配包含两者的行的正则表达式。然后使用s/// 来增加它们之间的部分。

【讨论】:

    【解决方案2】:
    sed 's,.*/content/folder\[@name=\(.*\)Failure.*,\1,' source.csv
    

    【讨论】:

      【解决方案3】:
      grep -Po '(?<=@name=).*(?=Failure)' source.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 2022-01-09
        相关资源
        最近更新 更多