使用Perl,sed,awk替换多线模式

时间:2017-01-30 18:03:13

标签: bash perl unix awk sed

我需要连接多个JSON文件,所以

        ...
        "tag" : "description"
    }
]
[
    {
        "tag" : "description"
        ...

进入这个:

    ...
    "tag" : "description"
},
{
    "tag" : "description"
    ...

所以我需要用] [替换模式,,但新行字符会让我发疯...

我使用了几种方法,我列出了一些方法:

  • SED

     sed -i '/]/,/[/{s/./,/g}' file.json
    

    但是我收到了这个错误:

    sed: -e expression #1, char 16: unterminated address regex
    
  • 我试图删除所有换行符 following this example

    sed -i ':a;N;$!ba;s/\n/ /g' file.json
    

    并且输出文件具有" ^ M"。虽然我在unix中修改了这个文件,但我在这个文件上使用了dos2unix命令,但没有任何反应。然后我尝试将特殊角色包括在内#" ^ M"在搜索上但结果更糟

  • 的Perl (按照提议here

    perl -i -0pe 's/]\n[/\n,/' file.json
    

    但是我收到了这个错误:

    Unmatched [ in regex; marked by <-- HERE in m/]\n[ <-- HERE / at -e line 1.
    

3 个答案:

答案 0 :(得分:2)

  

我想连接几个JSON文件。

如果我理解正确,你会有以下内容(其中字母代表有效的JSON值):

to_combine/file1.json: [a,b,c]
to_combine/file2.json: [d,e,f]

从那以后,您需要以下内容:

combined.json: [a,b,c,d,e,f]

您可以使用以下方法实现此目的:

perl -MJSON::XS -0777ne'
   push @data, @{ decode_json($_) };
   END { print encode_json(\@data); }
' to_combine/*.json >combined.json

关于Perl解决方案的问题:

  1. [在正则表达式模式中具有特殊含义。你需要逃脱它。
  2. 您只能进行一次更换。
  3. -0实际上并没有启用slurp模式。使用-0777
  4. 您可以在换行符之后放置逗号,在换行符之前它会更好。
  5. 修正:

    cat to_combine/*.json | perl -0777pe's/\]\n\[/,\n/g' >combined.json
    

答案 1 :(得分:1)

请注意,组合多个JSON文件的更好方法是将它们全部解析,组合解析后的数据结构,然后重新编码结果。只需将][的所有匹配项更改为逗号,,即可更改数据而非标记

sed是一个最小程序,一次只能在一行文件上运行。 Perl包含了sed或awk将要做的所有事情以及更多的事情,所以我建议你坚持下去

要将]...[中的所有file.json对(可能由空格分隔)更改为单个逗号,请使用此

perl -0777 -pe "s/\]\s*\[/,/g" file.json > file2.json

-0选项指定八进制行分隔符,并为其赋值777使perl立即读取整个文件

单行是着名的无法理解,我总是喜欢一个合适的程序文件,看起来像这样

join_brackets.pl

use strict;
use warnings 'all';

my $data = do {
    local $/;
    <>;
}

$data =~ s/ \] \s* \[ /,/gx;

print $data;

你可以将其作为

运行
perl join_brackets.pl file.json > joined.json

答案 2 :(得分:0)

我在你的问题中尝试了一些例子。

$ sed -rn '
    1{$!N;$!N}
    $!N
    /\s*}\s*\n\s*]\s*\n\s*\[\s*\n\s*\{\s*/M { 
        s//\},\n\{/
        $!N;$!N 
    }
    P;D
' file
        ...
        "tag" : "description"
},
{
        "tag" : "description"
        ...
        ...
        "tag" : "description"
},
{
        "tag" : "description"
        ...