Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 合并多行,直到在unix文件中找到记录分隔符_Perl_Awk_Sed - Fatal编程技术网

Perl 合并多行,直到在unix文件中找到记录分隔符

Perl 合并多行,直到在unix文件中找到记录分隔符,perl,awk,sed,Perl,Awk,Sed,我需要根据记录分隔符${1: 我的数据类似于: {1:1234}{2:qwerty}{4: 20:abc 30:def 40:ghi}{5:{hello}}${1:5678}{2:welcome$world}{4: 20:jkl 30:mno 40:pqr}{5:{good}}${1:9012} 我的输出应该是:- {1:1234}{2:qwerty}{4:20:abc30:def40:ghi}{5:{hello}} {1:5678}{2:welcome$world}{4:20:jkl30:m

我需要根据记录分隔符${1:

我的数据类似于:

{1:1234}{2:qwerty}{4:
20:abc
30:def
40:ghi}{5:{hello}}${1:5678}{2:welcome$world}{4:
20:jkl
30:mno
40:pqr}{5:{good}}${1:9012}
我的输出应该是:-

{1:1234}{2:qwerty}{4:20:abc30:def40:ghi}{5:{hello}}
{1:5678}{2:welcome$world}{4:20:jkl30:mno40:pqr}{5:{good}}
{1:9012}
i、 e.合并所有行并在${1:处拆分为一个新记录

perl -p -e 's/\n//; s/\$\{1/\n\{1/'
你可以把它当作管道

perl -p -e 's/\n//; s/\$\{1/\n\{1/' < input > ouput
awk'
开始{
RS=“\\$\{1”
FS=“\n”
OFS=“”
}
{$1=(NR>1?{1:“)$1;print}
"档案"
输出

{1:1234}{2:qwerty}{4:20:abc30:def40:ghi}{5:{hello}
{1:5678}{2:welcome$world}{4:20:jkl30:mno40:pqr}{5:good}
{1:9012}

您可以去掉所有的换行符(即做一条长行),然后插入 在所需位置添加换行符,然后使用以下命令删除尾随空格:

tr '\n' ' ' < your_file | sed 's/}\$/}\n/g; s/ $//g' > new_file

使用
perl

$perl-pe's/\n//if!eof;s/\$(?=\{1:)/\n/g'ip.txt
{1:1234}{2:qwerty}{4:20:abc30:def40:ghi}{5:hello}
{1:5678}{2:welcome$world}{4:20:jkl30:mno40:pqr}{5:good}
{1:9012}
  • s/\n//if!eof
    删除除最后一行以外的所有换行符
  • s/\$(?=\{1:)/\n/g
    仅当其后跟
    {1:
    时,才将
    $
    更改为
    \n
i、 e.合并所有行并在${1:处拆分为一个新记录

perl -p -e 's/\n//; s/\$\{1/\n\{1/'
使用awk的另一种方法是:

$ cat file
{1:1234}{2:qwerty}{4:
20:abc
30:def
40:ghi}{5:{hello}}${1:5678}{2:welcome$world}{4:
20:jkl
30:mno
40:pqr}{5:{good}}${1:9012}


# with ${1: as record separator
$ awk -v ORS= '{sub(/\$\{1:/,RS"{1:")}END{print RS}1' file
{1:1234}{2:qwerty}{4:20:abc30:def40:ghi}{5:{hello}}
{1:5678}{2:welcome$world}{4:20:jkl30:mno40:pqr}{5:{good}}
{1:9012}
sub(regex,sub,string)
此函数执行单个替换。它替换第一次出现的正则表达式模式 第三个参数是可选的。如果省略,则使用$0

ORS
它表示输出记录分隔符,默认值为换行符

RS
它表示(输入)记录分隔符,默认值为换行符

这可能适用于您(GNU-sed):

将文件放入保持空间

在文件末尾,交换到保留空间,删除所有换行符并用
\{1
替换
${1

逐行替换的替代方案:

sed ':a;N;s/\n//;tb;:b;s/$\({1\)/\n\1/;Ta;P;D' file

分隔符不就是
$
{1:
似乎仍然是下一条记录的一部分。这看起来可能是某种数据格式。可能有一个为它制作的解析器,您可以使用。感谢您的回复。每个记录都以$结尾。但问题是,如果记录数据包含$,如我的示例中所示,它不应该在那里拆分。因此,我需要合并所有行并添加一个n${1:简单地说,我需要合并所有行,并在${1:OP处将其拆分为多行。如果“$”在卷轴中,则不希望拆分。有时,数据可能包含$。因此,我需要在{1:之前或${1:之前添加新行,谢谢大家的更正。这非常好。谢谢先生:)谢谢大家的帮助。。。
sed 'H;$!d;x;s/\n//g;s/\${1/\n{1/g' file
sed ':a;N;s/\n//;tb;:b;s/$\({1\)/\n\1/;Ta;P;D' file