sed 将各行连接在一起
- 2024-10-24 08:51:00
- admin 原创
- 86
问题描述:
sed(或其他工具)命令是什么来将文件中不以字符“0”结尾的行连接在一起?
我会写这样的台词
412|n|Leader Building Material||||||||||d|d|20||0
需要保持不变,然后我会得到像这样的行(即 3 行,但只有一行以 0 结尾)
107|n|Knot Tying Tools|||||Knot Tying Tools |||||d|d|0||0
需要合并成一行
107|n|Knot Tying Tools|||||Knot Tying Tools|||||d|d|0||0
解决方案 1:
sed ':a;/0$/{N;s/
//;ba}'
在循环(分支ba
到标签:a
)中,如果当前行以 0 结尾(/0$/
)则附加下一行(N
)并删除内部换行符(`s/
//`)。
awk:
awk '{while(/0$/) { getline a; $0=$0 a; sub(/
/,_) }; print}'
Perl:
perl -pe '$_.=<>,s/
// while /0$/'
重击:
while read line; do
if [ ${line: -1:1} != "0" ] ; then
echo $line
else echo -n $line
fi
done
解决方案 2:
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
解决方案 3:
考虑到 OP 规范:sed join lines together ,这个答案的评级令人惊讶(这个关于 sed 替换的惊讶眨眼表情符号双关语是故意的) 。;s
本次提交的 最后一条评论
“如果是这样的话,请检查@ninjalj 提交的内容”
也建议检查相同的答案。
即使用`sed ':a;/0$/{N;s/
//;ba}'`逐字检查
sed ':a;/0$/{N;s/
//;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/
//g;p;};/0$/!d;z;x;s/
//g;'
或者:
sed ':a;/0$/!{N;s/
//;ba}'
不是:
sed ':a;/0$/{N;s/
//;ba}'
笔记:
sed 'H;${x;s/
//g;p;};/0$/!d;z;x;s/
//g;'
不使用分支并且
与以下内容相同:
sed '${H;z;x;s/
//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/
//g;}'
H
开始所有序列d
短路当前行上的进一步脚本命令执行并开始下一个循环,因此后面的地址选择器/0$/!
只能是,/0$/!!
所以的地址选择器
`/0$/{H;z;x;s/
//g;}`是多余的并且不需要。
如果一行不以 0 结尾,则将其保存在保留空间中
/0$/!{H;d;}
如果某一行以 0 结尾,也请将其保存,然后打印刷新(双重含义,即清除并对齐行)
`/0$/{H;z;x;s/
//g;}`
NB`${H;z;x;s/
//g;p;}使用
/0$/ ...带有额外命令的命令
p来强制最终打印,并使用现在不必要的命令
z`(清空并重置模式空间,如 s/.*//)
解决方案 4:
典型的 Perl 神秘语句:
perl -pe 'BEGIN{$/="0
"}s/
//g;$_.=$/'
这使用序列“0\n”作为记录分隔符(根据您的问题,我假设每行都应以零结尾)。任何记录都不应有内部换行符,因此会删除这些换行符,然后打印该行,并附加已删除的 0 和换行符。
回答您的问题的另一种方法是确保每行有 17 个用竖线分隔的字段。这并不假设第 17 个字段的值必须为零。
awk -F | '
NF == 17 {print; next}
prev {print prev $0; prev = ""}
{prev = $0}
'
解决方案 5:
如果以 0 结尾,则删除换行符..
sed '/0$/!N;s/
//'
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件