【问题标题】:Grep Text between pattern and space图案和空格之间的Grep文本
【发布时间】:2020-10-05 11:26:00
【问题描述】:

我有以下格式的数据。

sometext NAME=abc TIME_TAKEN
sometext NAME=xyz{123} REQUEST

我正在尝试 grep Name 和 space 之间的数据。我想要以下格式的输出

 abc
 xyz{123}

我尝试将 sed 与 cat 一起使用,如下所示,但它不起作用。

cat test.txt | sed 's/NAME=\(.*\)"\+[[:space:]]\+"/\1/g'

awk 'sub(/.*NAME= +/,"") && sub(/ +.*/,"")' test.txt

问候

【问题讨论】:

  • 为什么是双引号?我在输入数据中看不到任何内容。
  • 没有它就出错了,所以尝试了

标签: sed grep


【解决方案1】:

匹配作业前后的所有内容:

sed -ne 's/.* NAME=\(.*\) .*/\1/p' test.txt

小心!它将从每一行中提取 last NAME=...

【讨论】:

  • 这可能会比你预期的更多,记住.*是贪婪的。
【解决方案2】:

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

sed -En 's/.*\<NAME=(\S*).*/\1/p' file

关闭隐式打印-n并打开扩展正则表达式-E

匹配一个单词NAME,后跟=,然后是任意数量的非空白字符,并返回任意数量的非空白字符。

注意替换必须替换整行,因此 .* 位于正则表达式的开头和结尾。

【讨论】:

    【解决方案3】:

    试试下面的命令

    cat test.txt | sed 's#.*NAME=\(.* \).*#\1#'
    

    解释:

    cat test.txt | sed 's# .*NAME=        \(.* \)                  .*      #\1#'
    cat fileName | sed 's# All upto NAME= extract(upto any space)  skip all
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2022-10-19
      相关资源
      最近更新 更多