Awk 替换两个单词之间的换行符

Awk 替换两个单词之间的换行符,awk,Awk,我有一个文本文件的输出,如下所示。我想把someItems数组的所有内容放在一行下面。因此,每一行都有一个新的someItems数组的内容。例如: "someItems": [ { "someId": "MountSomers-showtime.com-ETTI0000000000000003-1452005472058", "source": "MountSomers", "sourceAssetId": "9", "title": "Pk_3", "ppp": "12",

我有一个文本文件的输出,如下所示。我想把someItems数组的所有内容放在一行下面。因此,每一行都有一个新的someItems数组的内容。例如:

"someItems": [
{
  "someId": "MountSomers-showtime.com-ETTI0000000000000003-1452005472058",
  "source": "MountSomers",
  "sourceAssetId": "9",
  "title": "Pk_3",
  "ppp": "12",
  "expirationDate": "2016-01-06T14:51:12Z"
},    {
  "someId": "MountSomers-ericsson.com- ETTI0000000000000005-1452005472058",
  "source": "MountSomers",
  "sourceAssetId": "12",
  "title": "Pk_5",
  "ppp": "12",
  "expirationDate": "2016-01-06T14:51:12Z"
}  ]
"someItems": [
{
  "someId": "MountSomers-hbo.com-ETTI0000000000000002-1452005472058",
  "source": "MountSomers",
  "sourceAssetId": "7",
  "title": "Pk_2",
  "ppp": "12",
  "expirationDate": "2016-01-06T14:51:12Z"
},    {
  "someId": "MountSomers-showtime.com-ETTI0000000000000003-1452005472058",
  "source": "MountSomers",
  "sourceAssetId": "9",
  "title": "Pk_3",
  "ppp": "12",
  "expirationDate": "2016-01-06T14:51:12Z"
},    {
  "someId": "MountSomers-ericsson.com-ETTI0000000000000005-1452005472058",
  "source": "MountSomers",
  "sourceAssetId": "12",
  "title": "Pk_5",
  "ppp": "12",
  "expirationDate": "2016-01-06T14:51:12Z"
}  ]
将成为

"someItems": [ ..... ]
"someItems": [ ..... ] 
我有下面的

cat file | | awk '/^"someItems": [/{p=1}/^]/{p=0} {if(p)printf "%s",$0;else printf "%s%s\n",(NR==1?"":RS),$0}'

但它不符合我的要求

由于输入仅在外部级别包含方括号,因此解决方案非常简单:

awk '{gsub("\n","", $0)}1' RS=']\n' file
我正在使用
]\n
作为输入记录分隔符。这将为您提供
“someItems:…”
之间的整个部分,直到关闭
]
为止,作为
$0
gsub()
只是替换换行符<代码>1打印(修改的)记录


您还可以使用
sed

sed '/\[/{:a;N;/]/!ba;s/\n//g}' file
我将在多行版本中对此进行解释:

script.sed:

#地址。匹配包含洞口的行[
/\[/{#块的开始
#定义标签“a”
:a
#读取新行并将其附加到模式缓冲区
N
#如果模式缓冲区不包含结束符]
#跳回标签“a”
/]/!巴
#出现右括号后,请更换所有换行符
#因为在这种情况下我们不会跳回“a”,这意味着我们将
#离开区块,开始新的循环。
s/\n//g
}#块端

打印不带尾随换行符的每一行。从第二个匹配项开始,在每个
“someItems”
之前放置一个前导换行符。在结尾处打印一条换行符以保持优雅。

awk解决方案简单明了+1.
$ awk '/^"someItems":/ && f { printf "\n" } { printf $0; f=1 } END { printf "\n" }' file.txt
"someItems": [{  "someId": "MountSomers-showtime.com-ETTI0000000000000003-1452005472058",  "source": "MountSomers",  "sourceAssetId": "9",  "title": "Pk_3",  "ppp": "12",  "expirationDate": "2016-01-06T14:51:12Z"},    {  "someId": "MountSomers-ericsson.com- ETTI0000000000000005-1452005472058",  "source": "MountSomers",  "sourceAssetId": "12",  "title": "Pk_5",  "ppp": "12",  "expirationDate": "2016-01-06T14:51:12Z"}  ]
"someItems": [{  "someId": "MountSomers-hbo.com-ETTI0000000000000002-1452005472058",  "source": "MountSomers",  "sourceAssetId": "7",  "title": "Pk_2",  "ppp": "12",  "expirationDate": "2016-01-06T14:51:12Z"},    {  "someId": "MountSomers-showtime.com-ETTI0000000000000003-1452005472058",  "source": "MountSomers",  "sourceAssetId": "9",  "title": "Pk_3",  "ppp": "12",  "expirationDate": "2016-01-06T14:51:12Z"},    {  "someId": "MountSomers-ericsson.com-ETTI0000000000000005-1452005472058",  "source": "MountSomers",  "sourceAssetId": "12",  "title": "Pk_5",  "ppp": "12",  "expirationDate": "2016-01-06T14:51:12Z"}  ]
$