Perl 合并多行,直到在unix文件中找到记录分隔符
我需要根据记录分隔符${1: 我的数据类似于: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: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
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