【问题标题】:How can I remove and replace specific field value by name instead of fix column如何按名称而不是修复列删除和替换特定字段值
【发布时间】:2014-11-17 03:35:28
【问题描述】:

我想逐行替换和删除文本文件中的子字符串。我要更改的信息位于特定字段下。例如,我有以下文字:

{name:x, version:1.0, info:"test", ...}
{name:y, version:0.1, info:"test again", ...}
{name:z, version:1.1, info:"test over", ...}
{name:x, info: "test", ..., version:1.2, ...}

该字段可以随机排列。我想删除所有版本值并用某个特定字符串替换所有信息值,我们说“foo”。

预期结果:

{name:x, info:"foo", ...}
{name:y, info:"foo", ...}
{name:z, info:"foo", ...}
{name:x, info:"foo", ...}

有没有聪明的方法可以通过 shell 脚本来做到这一点?我不知道如何替换上面的子字符串?

我知道一些愚蠢的命令

sed 's/info:\([^,}]*\)/info:\"foo\"/' file
sed 's/version:\([^,}]*\)//' file

【问题讨论】:

  • 您发布的sed 有什么问题?最好包括当前输出和错误描述。祝你好运。
  • 对 json 数据使用 json 工具(假设是这样)。
  • json 工具?你能提供更多信息吗? @EtanReisner
  • 当前的 sed 是正确的。我只是想找到一种更聪明的方法@shellter
  • @eleven 如果您正在寻找一种更智能的方式,那么您需要遵循 Etan 的建议。使用 bash 和 family 解析 JSON 非常 容易出错。如果您当前的sed 命令有效,那么您应该坚持使用它。但是,我感觉您的 sed 解决方案对某些输入感到厌烦,因此您提出了问题。

标签: linux bash shell command-line sed


【解决方案1】:
sed 's/\(version:[^,}]*,\)*\(.*\)info:[^,}]*\(,\{0,1}\)\(.*\)\(, *version:[^,}]*,\)*/\2info:"foo"\3\4/' file

(未测试)应该可以解决问题(--posix 用于 GNU sed)

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2012-01-15
    • 1970-01-01
    • 2022-01-13
    • 2015-11-11
    • 1970-01-01
    • 2015-01-14
    • 2017-03-17
    • 2017-12-01
    相关资源
    最近更新 更多