perl 用常量字符串替换json对象值

cwxwcias  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(149)

我在一个json文件中有下面的json内容,下面的json中的“pos”值是一个变量,需要用一个常量(如NNNN)替换它。

{
  "qual_table": "TKGGU1.TCUSTORD",
  "op_type": "INSERT",
  "op_ts": "YYYY-MM-DDTHH:MI:SS.FFFFFFZ", 
  "pos": "G-AAAAAJcRAAAAAAAAAAAAAAAAAAAHAAoAAA==10687850.2.31.996",
  "xid": "0.2.31.996",
  "after": {
    "CUST_CODE": "BILL",
    "ORDER_DATE": "YYYY-MM-DD:HH:MI:SS", 
    "PRODUCT_CODE": "CAR",
    "ORDER_ID": 765,
    "PRODUCT_PRICE": 1500000,
    "PRODUCT_AMOUNT": 3,
    "TRANSACTION_ID": 100
  }
}

我试过perl -i -pe 's/[A-Z]-[A-Z]*\.==*/ NNNN/g' filename.json,但没有效果。
你能建议我一个正则表达式吗?请注意,这是一个变量,每次都有不同的长度。

sbtkgmzw

sbtkgmzw1#

jq是从脚本和命令行处理JSON的事实上的标准工具,它使得用新值更新对象的字段变得很简单:

$ jq '.pos = "NNNN"' input.json
{
  "qual_table": "TKGGU1.TCUSTORD",
  "op_type": "INSERT",
  "op_ts": "YYYY-MM-DDTHH:MI:SS.FFFFFFZ",
  "pos": "NNNN",
  "xid": "0.2.31.996",
  "after": {
    "CUST_CODE": "BILL",
    "ORDER_DATE": "YYYY-MM-DD:HH:MI:SS",
    "PRODUCT_CODE": "CAR",
    "ORDER_ID": 765,
    "PRODUCT_PRICE": 1500000,
    "PRODUCT_AMOUNT": 3,
    "TRANSACTION_ID": 100
  }
}

(Note当标准输出是管道、文件或终端以外的其他内容时,JSON将以紧凑的形式打印在一行上。)
等效的perl one(ish)-liner将类似于

perl -MJSON::MaybeXS -MFile::Slurper=read_text -E '
  my $json = JSON::MaybeXS->new;
  my $obj = $json->decode(read_text($ARGV[0]));
  $obj->{pos} = "NNNN";
  say $json->encode($obj);' input.json

(根据您的首选JSON和文件读取模块的需要进行调整)

watbbzwu

watbbzwu2#

perl -pe 's/"pos"\s*:\s*"\K[^"]*/NNNN/g' filename.json

只要字符串中没有引号或换行符,就应该适用于pos的任何长度。
正如Shawn所指出的,最好使用json操作工具而不是字符串操作工具,否则你将不得不依赖于假设。

相关问题