【问题标题】:Sed + replacing the content after specific syntaxsed + 替换特定语法后的内容
【发布时间】:2019-12-22 16:31:54
【问题描述】:

我们尝试替换组词之后的第三个字段的内容,

文件中的以下行始终使用相同的语法,除了第三个字段发生变化

"groups": [{"group": "string”}],

第三个字段包含A-Za-z、数字、(_ - .)的任意组合

第三个字段总是用双引号引起来

例子

"groups": [{"group": "MOVIES.ARE.GOOD”}],

"groups": [{"group": "no_one.ok”}],

"groups": [{"group": "evry_one.lol”}],

"groups": [{"group": "NO_VALUES_ARE-GOOD”}],

"groups": [{"group": "___scripts”}],

我尝试使用以下 sed ,但没有成功

var=my.word__that.I.need.to.replace
sed  -i "s/\(group\": \"\)[*]*/\1$var/"  file

【问题讨论】:

  • 这是 JSON 数据吗?如果是这样,您最好使用旨在编辑 JSON 的工具(如 jq)。此外,您当前的模式看起来像是在尝试匹配第二个字段(“group”),而不是第一个字段(“groups”);这是故意的吗?最后,第三个字段之后的右引号实际上是花哨的 unicode 引号 (),还是纯 ASCII 引号 (")。
  • 它不是json,只是看起来像json
  • 你永远不会匹配sed。你最后的'"'不是ASCII 0x22,而是一些web”多字节字符'”'。你首先需要解决这个问题——然后它会让你更容易匹配sed,例如sed 's/["][^"]*["]/"'$var'"/3'
  • 最后的结束引号是多字节字符序列e2 80 9d,这正是”字符UTF-8 encoding table and Unicode characters

标签: bash sed redhat


【解决方案1】:

假设:

  • 所有引号都是"。请参阅上面@Gordon 的评论。
  • 您想替换每行中的第三个字段。
  • 替换值存储在变量中。
  • 我在这个文件内容(文件名 data.txt)上测试了我的命令:

    "groups": [{"group": "MOVIES.ARE.GOOD”}],  
    
    "groups": [{"group": "no_one.ok”}],
    
    "groups": [{"group": "evry_one.lol”}],
    
    "groups": [{"group": "NO_VALUES_ARE-GOOD”}],
    
    "groups": [{"group": "___scripts”}],
    

这对我有用:

newword=TATA
sed -i "s/\(group\": \"\).*/\1$newword\"\}\],/"  data.txt

基本上,group": " 后面的所有内容都会被 TATA"}], 替换


我的结果文件现在包含:

"groups": [{"group": "TATA"}],

"groups": [{"group": "TATA"}],

"groups": [{"group": "TATA"}],

"groups": [{"group": "TATA"}],

"groups": [{"group": "TATA"}],

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多