【问题标题】:Extract substring using regex shell使用正则表达式外壳提取子字符串
【发布时间】:2013-11-27 09:06:24
【问题描述】:

我有一个包含多次出现的字符串:

element 1 tag1{field1:"text",field2:"text"...},tag2{field1:"text",field2:"text"...},.. 
element 2 tag1{field1:"text",field2:"text"...},tag2{field1:"text",field2:"text"...},..

我想使用shell提取所有元素的tag1的所有fields1

我的尝试:

sed -n "s/.*\"tag1\":{\"fiel1\":\"\(.*\),\"fiel2\".*/\1/gp"

我得到的只是最后一个,而不是全部。

编辑:问题是整个文本都在一个字符串中,而正则表达式只会让我同时出现一次。

谢谢

【问题讨论】:

  • 您通常不应该使用正则表达式来解析结构化数据。如果您可以将其转换为 JSON 或 XML,那么有很多工具可以帮助您。
  • 我怀疑文本示例缺少 tag1 周围的引号,并且:或者您的 sed 将永远找不到任何东西

标签: regex shell sed


【解决方案1】:

你可以试试这个,

sed 's/\(.*tag1{field1:"\)\([^"]*\)\(".*\)/\2/g' yourfile

【讨论】:

    【解决方案2】:
    perl -pe 's/tag1\{field1:\"([^\"]*)".*/$1/g' your_file
    

    或者

    awk -F":|," '{print $2}'
    

    【讨论】:

      【解决方案3】:
      sed -n 's/.*[[:space:]]\{1,\}tag1{field1:"\([^"]*\)".*/\1/gp' YourFile
      

      基于文本样本

      element 1 tag1{field1:"text",field2:"text"...},tag2{field1:"text",field2:"text"...},.. 
      element 2 tag1{field1:"text",field2:"text"...},tag2{field1:"text",field2:"text"...},..
      

      【讨论】:

        【解决方案4】:

        使用awk

        awk -F\" '{print $2}'
        

        或确保仅提取带有 field1 的行

        awk -F\" '/field1/ {print $2}'
        

        【讨论】:

          猜你喜欢
          • 2013-11-13
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          相关资源
          最近更新 更多