使用sed命令

时间:2015-09-15 09:08:25

标签: regex bash sed

我尝试删除倒数第二行的逗号:

{
  "subject" : {
    "value" : "http://d-nb.info/gnd/1-2",
    "type" : "uri"
    },
  "predicate" : {
    "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
    "type" : "uri"
    },
  "object" : {
    "value" : "http://d-nb.info/standards/elementset/gnd#SeriesOfConferenceOrEvent",
    "type" : "uri"
    }
  },
{

我正在使用此命令:

<test2.file sed '/^\s*\},$/ { N; s/^\s*\},\n\{/^\s*\}\n\{/ }' 

我希望输出应该是这样的:

{
  "subject" : {
    "value" : "http://d-nb.info/gnd/1-2",
    "type" : "uri"
    },
  "predicate" : {
    "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
    "type" : "uri"
    },
  "object" : {
    "value" : "http://d-nb.info/standards/elementset/gnd#SeriesOfConferenceOrEvent",
    "type" : "uri"
    }
  }
{

但它返回错误。

  

sed:-e表达式#1,字符42:不匹配{

有人知道它有什么问题吗? THX。

P.S。,这是文件的结尾:

{
  "subject" : {
    "value" : "http://d-nb.info/gnd/1060867974",
    "type" : "uri"
    },
  "predicate" : {
    "value" : "http://d-nb.info/standards/elementset/gnd#preferredNameEntityForThePerson",
    "type" : "uri"
    },
  "object" : {
    "value" : "_:genid12768016",
    "type" : "bnode"
    }
  }

2 个答案:

答案 0 :(得分:2)

请勿在您的模式/地址部分中转义{ or }。 sed默认使用BRE。对于BRE,像{ ( + ..这样的字符没有特殊含义,你必须逃脱它们才能赋予它们特殊的含义。

在您的情况下,您希望匹配文字{ or },然后不要逃避它们。

修改

我想你要删除最后一个逗号,以便更改:

...
 },
{

...
 }
{

然后你可以尝试:

awk -v RS='\0' '7+gsub(/,\s*{/,"\n{")' file

使用您的文件进行测试:

kent$  awk -v RS='\0' '7+gsub(/,\s*{/,"\n{")' f
{
  "subject" : {
    "value" : "http://d-nb.info/gnd/1-2",
    "type" : "uri"
    },
  "predicate" : {
    "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
    "type" : "uri"
    },
  "object" : {
    "value" : "http://d-nb.info/standards/elementset/gnd#SeriesOfConferenceOrEvent",
    "type" : "uri"
    }
  }
{

答案 1 :(得分:0)

您可以使用缩进识别正确的行吗?

sed 's/^ },/ }/'