什么是sed(或其他工具)命令将文件中的行连接在一起,而不是以字符“0”结尾?
我会有像这样的行
412 | n |领导建筑材料|||||||||| d | d | 20 || 0
需要单独留下,然后我会有这样的行(例如3行,但只有一行w / 0)
107 | n |结扎工具|||||结扎工具
||||| d | d | 0 || 0
需要加入/组合成一行
107 | n |结扎工具|||||结扎工具||||| d | d | 0 || 0
答案 0 :(得分:45)
sed ':a;/0$/{N;s/\n//;ba}'
在循环(分支ba
到标签:a
)中,如果当前行以0(/0$/
)结尾,则追加下一行(N
)并删除内部换行符(s/\n//
)。
<强> AWK:强>
awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'
<强>的Perl:强>
perl -pe '$_.=<>,s/\n// while /0$/'
<强> bash中:强>
while read line; do
if [ ${line: -1:1} != "0" ] ; then
echo $line
else echo -n $line
fi
done
答案 1 :(得分:8)
awk也可能很短:
awk '!/0$/{printf $0}/0$/'
试验:
kent$ cat t
#aasdfasdf
#asbbb0
#asf
#asdf0
#xxxxxx
#bar
kent$ awk '!/0$/{printf $0}/0$/' t
#aasdfasdf#asbbb0
#asf#asdf0
#xxxxxx#bar
答案 2 :(得分:3)
这个answer的评分令人惊讶;s
(考虑到OP规范:sed join lines together,这对于sed替换的惊奇表情符号是有意的)。
此submission's最后评论
“如果是这样,请查看@ninjalj提交的内容”
还建议检查same answer。
即。使用sed ':a;/0$/{N;s/\n//;ba}'
逐字检查
sed ':a;/0$/{N;s/\n//;ba}'
does
no one
ie. 0
people,
try
nothing,
ie. 0
things,
any more,
ie. 0
tests?
(^D aka eot 004 ctrl-D ␄ ... bash generate via: echo ^V^D)
不会给(做测试;):
does no one ie. 0
people, try nothing, ie. 0
things, any more, ie. 0
tests? (^D aka eot 004 ctrl-D ␄ ... bash generate via: echo ^V^D)
要使用此功能:
sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
或:
sed ':a;/0$/!{N;s/\n//;ba}'
不
sed ':a;/0$/{N;s/\n//;ba}'
注意:
sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
不使用分支和 与...相同:
sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
H
开始所有序列d
在当前行短路进一步脚本命令执行并开始下一个周期,因此/0$/!
后面的地址选择器只能是/0$/!!
所以地址选择器为
/0$/{H;z;x;s/\n//g;}
是多余的,不需要。/0$/!{H;d;}
/0$/{H;z;x;s/\n//g;}
${H;z;x;s/\n//g;p;}
使用带有额外/0$/ ...
的{{1}}命令强制执行最终打印,并使用现在不必要的p
(以清空和重置模式空间,如s /。 * //)答案 3 :(得分:2)
如果以0存储结束,则删除换行符..
sed '/0$/!N;s/\n//'
答案 4 :(得分:2)
典型的隐秘Perl单线:
perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'
这使用序列“0 \ n”作为记录分隔符(根据您的问题,我假设每一行都应以零结尾)。那么任何记录都不应该有内部换行符,因此删除它们,然后打印该行,追加被删除的0和换行符。
您的问题的另一个问题是确保每一行有17个以管道分隔的字段。这并不假设第17个字段值必须为零。
awk -F \| '
NF == 17 {print; next}
prev {print prev $0; prev = ""}
{prev = $0}
'