【问题标题】:Grep for Multiple instances of string between a substring and a character?Grep 用于子字符串和字符之间的多个字符串实例?
【发布时间】:2015-12-05 18:08:35
【问题描述】:

您能告诉我如何对文件内多行上多次出现的子字符串的每个实例进行 Grep 处理吗?

我看过 https://unix.stackexchange.com/questions/131399/extract-value-between-two-search-patterns-on-same-lineHow to use sed/grep to extract text between two words?

但我的问题略有不同 - 每个子字符串的前面都将紧跟字符串:name">,并且将在我想要的子字符串的最后一个字符之后立即终止为 < 字符。

所以一行可能是

<"name">Bob<125><adje></name><"name">Dave<123><adfe></name><"name">Fred<125><adfe></name>

我希望输出是:

Bob
Dave
Fred

【问题讨论】:

  • 只显示一个样本行不太可能帮助我们为您找到一个可靠的解决方案。您的文字说该问题与多行有关,因此请显示多行。还可以使用{} 编辑器按钮来格式化您的输入/输出/代码文件。
  • 所以你真的想用正则表达式解析 XML?请参阅stackoverflow.com/questions/1732348/… 了解为什么不这样做 ;-) 祝你好运。
  • 感谢到目前为止的依赖,抱歉我的问题格式不好!
  • 感谢迄今为止的依赖,抱歉我的问题格式不佳!我意识到我真正希望的是,如果多组数据不在同一行上,所以我这样做了(得到了这样的想法):code grep name\"\> | awk '{ gsub( "\"name\">", "\n\"name\">") } 1' code 在每个“name”字段前插入一个新行,(和其他)然后我使用了Grep 和 Cut 只破解数据,它既慢又不优雅,但它确实有效。我当然会看看其他答案并比较它们,谢谢。

标签: awk sed grep pcre


【解决方案1】:

虽然awk不是xml处理的最佳工具,但如果你的xml结构和数据足够简单,它会有所帮助。

$ awk -F"[<>]" '{for(i=1;i<NF;i++) if($i=="\"name\"") print $(++i)}' file
Bob
Dave
Fred

我怀疑标签是&lt;"name"&gt;。如果是&lt;name&gt;,不带引号将脚本中的条件更改为$i=="name"

【讨论】:

    【解决方案2】:

    呆呆

    awk -vRS='<"name">|<' '/^[A-Z]/' file
    Bob
    Dave
    Fred
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2018-08-25
      • 2015-04-10
      相关资源
      最近更新 更多