【问题标题】:Sed command with \n带有 \n 的 Sed 命令
【发布时间】:2013-07-08 15:18:19
【问题描述】:

我有一个部分损坏的 JSON 文件的数据库。出于某种原因编写它们的人在文件末尾包含了一个额外的逗号。这些文件有无数个,所以我需要修复它们。这是它的样子:

{
"foo": "bar",
"foo1": "bar1",
"foo2": "bar2",
}

所以我正在尝试使用 sed 命令来去掉逗号。现在,我已经 sed 's|',\n}'|'\n}'|'但它没有修改文件。我做错了什么?

【问题讨论】:

  • 请格式化您的代码,使其更具可读性。例如,在 "sed..." 行周围加上反引号而不是引号(或者在这种情况下,是开头的引号)
  • 你安装了 Perl 吗?使用 Perl 比使用 sed 容易得多

标签: macos bash unix ubuntu


【解决方案1】:

OS X 附带的sed 版本不会将\n 视为换行符,而是将其视为转义的“n”(减少为常规的“n”)。由于您使用的是bash,您可以尝试以下操作:

sed $'s|,}|\\\n|' file.txt

$'...'bash 中的一种特殊引用类型,它允许对某些转义进行特殊处理。 \\\n 是一个转义反斜杠,后跟一个换行符,bash 将其作为单个转义换行符呈现给 sed

更新:记得在搜索文本中使用$ 而不是换行符后,我意识到您无法匹配下一行中后跟大括号的命令(或者至少,我不知道用我有限的sed 命令怎么样)。

【讨论】:

  • 搜索了一圈后发现:sed 'N;s|,\n}|}|'但现在它删除了大括号而不是逗号。
  • 运行 sed $'s|,\\\n}|\\\n}|' file.txt 返回 sed: 1: "s|,\ }|\ }|": 未终止的替代模式
  • 这给出了:OSX 10.6.2 上的`未终止的替代模式`
【解决方案2】:

你可以试试 awk:

awk '{ if (/}/) sub(",$", "", last); if (last) print last; last=$0 } END { print last }'

【讨论】:

    【解决方案3】:

    这是一个同样适用于 OSX 的 sed 解决方案:

    sed -e ':a' -e 'N; $!ba' -e 's/,\(\n}\)/\1/' file.json
    

    作为替代方案,您可以使用以下命令在 OSX 上安装 gnu-sed:

    sudo brew install gnu-sed
    

    然后运行:

    gsed -e ':a; N; $!ba; s/,\(\n}\)/\1/' file.json
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2014-12-13
      • 2021-10-11
      • 2020-05-21
      • 2015-01-26
      相关资源
      最近更新 更多