【问题标题】:Strings between 2 characters unix2个字符unix之间的字符串
【发布时间】:2017-11-11 09:50:48
【问题描述】:

首先,我想为发布类似的帖子而道歉。但由于我无法解决它,所以我发布它。

我有一个有线字符串模式(mongo 输出),我只需要将其转换为值。

"_id" : ObjectId("59280d9b95385c78b73252e4"), "categorySetId" : NumberLong(1100000041), "categorySetName" : "PROD GROUP", "serviceableProductFlag" : "N", "categoryId" : NumberLong(1053), "pid" : "800-319-03", "productFamily" : "PP", "productType" : "SEATS", "subGroup" : "PP SER", "description" : "^AY,EECH, NG-C", "inventoryItemId" : NumberLong(200699), "itemStatusMfg" : "S-INTV", "organizationIdMfg" : NumberLong(90000), "src" : "orcl", "syncedOn" : NumberLong("1495797136138"), "CreationDate" : ISODate("2017-05-26T11:12:16.138Z"), "CreatedBy" : "tool", "LastUpdatedDate" : ISODate("2017-05-26T11:12:16.138Z"), "LastUpdatedBy" : "tool", "itemFamilyDesc" : "PP FAMILY", "itemFamilyGroupId" : 750, "itemFamilyGroupName" : "PP SERIES PRODUCTS"

我想要像

这样的输出
59280d9b95385c78b73252e4,1100000041,PROD GROUP,N,1053,800-319-03,PP, SEATS,PP SER ,'^AY,EECH, NG-C', 200699,S-INTV,90000,orcl,1495797136138,2017-05-26T11:12:16.138Z,tool,2017-05-26T11:12:16.138Z,tool,PP FAMILY,750,PP SERIES PRODUCTS

我尝试了各种 sed 和 awk 但我无法实现。

sed 's/"[^"]*://g' text.txt
sed 's/"[^:]*://g' text.txt

有人可以帮我吗?

非常感谢。

【问题讨论】:

  • 而不是这么长的一行,把它分解...使用一个最小的例子,比如 3-5 个元素...输入是某种 xml、json 等吗?所以有比使用正则表达式更好的工具
  • 使用提供mongo客户端库的编程语言
  • 所以你想让单个输入值"^AY,EECH, NG-C"(来自"description" : "^AY,EECH, NG-C")变成3个独立的输出值^AY,EECH,NG-C

标签: shell awk sed cut


【解决方案1】:

awk解决方案:

awk -F': +|, *"' '{ r=""; for(i=2;i<=NF;i+=2) { 
         gsub(/^ *([^(]+\()?|"|\)$/,"",$i); 
         if(index($i,",")!=0){ $i="\047"$i"\047" } r=(r!="")? r","$i : $i 
     } print r }' text.txt

输出:

59280d9b95385c78b73252e4,1100000041,PROD GROUP,N,1053,800-319-03,PP,SEATS,PP SER,'^AY,EECH, NG-C',200699,S-INTV,90000,orcl,1495797136138,2017-05-26 11:12:16.138Z,tool,2017-05-26 11:12:16.138Z,tool,PP FAMILY,750,PP SERIES PRODUCTS

  • -F':|, *"' - 字段分隔符

  • for(i=2;i&lt;=NF;i+=2) - 遍历所有 even 字段

  • gsub(/^ *([^(]+\()?|"|\)$/,"",$i) - 替换/删除过多的实例名称,如 ObjectId( 和双引号 "

【讨论】:

  • 是的。那是一个字段
  • @user2854333,如果这个值"^AY,EECH, NG-C"不应该被分隔,它应该保持原样(用双引号括起来)
  • @user2854333,您需要在您的问题中发布确切的最终输出,以便我看到它
  • @user2854333,我已经要求在您的问题中发布确切的最终输出,因为它应该在那里,而不是在 cmets 中跨度>
  • @user2854333,你明白这句话post the exact final output in your question 吗?
【解决方案2】:

您的某些字段值已嵌入逗号,因此这很可能是徒劳的,但是...

#! /bin/sed -rf

s/\s*"[^"]+"\s*:\s*\w+\s*\("([^"]*)"\)\s*/\1/g
s/\s*"[^"]+"\s*:\s*\w+\s*\(([^)]*)\)\s*/\1/g
s/\s*"[^"]+"\s*:\s*"([^"]*)"\s*/\1/g
s/\s*"[^"]+"\s*:\s*([0-9]+)\s*/\1/g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2020-10-29
    • 1970-01-01
    • 2016-08-20
    • 2015-07-23
    相关资源
    最近更新 更多