【问题标题】:Extracting text in between strings提取字符串之间的文本
【发布时间】:2010-08-20 15:49:02
【问题描述】:

如何从包含这些行的文件中提取具有非常特定模式的字符串之间的文本?例如:

input:a_log.gz:make=BMW&year=2000&owner=Peter

我想从本质上捕获make=BMW&year=2000 的部分。我知道这一行可以以“input:(任意数量的字符).gz:”开头并以“owner=Peter”结尾

【问题讨论】:

    标签: sed awk grep


    【解决方案1】:

    使用正则表达式:input:.*?\.gz:(.*?)&?owner=Peter。捕获将包含第二个冒号和“owner=Peter”之间的内容,修剪 & 符号。

    【讨论】:

    • 我将在正则表达式中使用什么实用程序?只是grep?
    • @syker: sed 's/input:.*?\.gz:(.*?)&?owner=Peter/\1/' <myfile
    • 为了让它工作,你需要在括号上加上反斜杠。
    • @syker:问号是为了使模式不贪婪,但这不适用于sed。
    【解决方案2】:

    试试这个:

    sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file
    

    这将提取第二个冒号和第二个&符号之间的所有内容,无论之前和之后是什么(如果有更多的冒号或&符号,它可能无法正常工作)。

    【讨论】:

      【解决方案3】:

      你可以使用 shell(bash/ksh)

      $ s="input:a_log.gz:make=BMW&year=2000&owner=Peter"
      $ s=${s##*gz:}
      $ echo ${s%%owner=Peter*}
      make=BMW&year=2000&
      

      如果你想要 sed

      $ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
      make=BMW&year=2000&
      

      【讨论】:

        【解决方案4】:
        >echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
        make=BMW&year=2000
        

        【讨论】:

          【解决方案5】:

          我没有看到使用 awk 的答案:

          awk '{ match($0, /input:.*\.gz:/);
                 m = RSTART+RLENGTH;
                 n = index($0, "&owner=Peter") - m;
                 print substr($0,m,n)
               }'
          

          该方法是sh 版本(参数扩展的子字符串)和sed(正则表达式)版本之间的混合。这是因为awk RE 缺少反向引用。

          【讨论】:

          • 如果您使用的是 nawk 或旧的 awk。 gawk 有反向引用。
          • @ghostdog74 我正在使用awk,如我的“AWK 编程语言”副本中所述。 gawk != awk(虽然可能是 gawk > awk)。对我来说,使用awk 的优势之一是默认可用性,当您编写gawk 特定代码时它会消失。
          猜你喜欢
          • 2018-02-07
          • 2020-08-09
          • 1970-01-01
          • 2017-11-10
          • 2016-08-13
          • 2013-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多