2016-01-05 40 views
1

我有如下文本文件的输出。我想把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}' 

,但它不会做什么我想...

回答

1

由于输入包含括号[]只在外层解决方案可以很简单:

awk '{gsub("\n","", $0)}1' RS=']\n' file 

我使用]\n作为输入记录分隔符。这给你的整个部分之间​​直到关闭]作为$0gsub()只是替换换行符。 1打印(修改)的记录。


您还可以使用sed

script.sed

# Address. Matches a line containing the opening [ 
/\[/ { # Start of block 

    # Define a label 'a' 
    :a 

    # Read a new line and append it to the pattern buffer 
    N 

    # If the pattern buffer doens't contain the closing ] 
    # jump back to label 'a' 
    /]/!ba 

    # Replace all newlines once the closing bracket appeared 
    # Since we don't jump back to 'a' in this case, this means we'll 
    # leave the block and start a new cycle. 
    s/\n//g 

} # End of block 
+0

awk解决方案简单直接。 +1。 – slayedbylucifer

+0

非常感谢! – user2405589

0
$ 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"} ] 
$ 
sed '/\[/{:a;N;/]/!ba;s/\n//g}' file 

我将在多版本的解释打印每一行都没有尾随的换行符。从第二次出现开始,在每个"someItems"前放置一个前导换行符。在最后打印换行符以保持优雅。