我有一个包含以下内容的文件:
L1
L2
L3
.
.
.
L512
我想将其内容更改为:
L1 | L2 | L3 | ... | L512
看起来很容易,但是现在我坐了1个小时并尝试制作它,我试着用sed做,但没有得到我想要的东西。看来sed只是在内容之间插入空行,有什么建议吗?
答案 0 :(得分:1)
这是一个sed
sed ':a;N;s/\n/ | /g;ta' file
L1 | L2 | L3 | ... | L512
一个awk
awk '{printf("%s%s",sep,$0);sep=" | "} END {print ""}' file
L1 | L2 | L3 | ... | L512
答案 1 :(得分:1)
使用sed,这需要将整个输入读入缓冲区,然后用|
替换所有换行符,如下所示:
sed ':a;N;$!ba;s/\n/ | /g' input.txt
第1部分 - 缓冲输入
:a
定义了一个名为' a'
N
从输入中获取下一行并将其附加到模式缓冲区
除非到达输入结尾,否则$!ba
会跳转到a
第2部分 - 按|
s/\n/|/
在模式缓冲区
正如您所看到的,这是非常低效的,因为它需要:
因此我建议使用awk,它可以在一个循环中完成:
awk 'NR==1{printf $0;next}{printf " | "$0}END{print ""}' input.txt
答案 2 :(得分:0)
perl -pe 's/\n/ |/g unless(eof)' file
答案 3 :(得分:0)
如果|
之间的空格不是必需的
tr "\n" '|' YourFile
答案 4 :(得分:-1)
有几个选项,包括这里提到的那些:
paste -sd'|' file
sed ':a;N;s/\n/ | /g;ta' file
sed ':a;N;$!ba;s/\n/ | /g' file
perl -0pe 's/\n/ | /g;s/ \| $/\n/' file
perl -0nE 'say join " | ", split /\n/' file
perl -E 'chomp(@x=<>); say join " | ", @x' file
mapfile -t ary < file; (IFS="|"; echo "${ary[*]}")
awk '{printf("%s%s",sep,$0);sep=" | "} END {print ""}' file