如何放置 |在文本文件的内容行之间?

how to put | between content lines of a text file?

我有一个文件包含:

L1
L2
L3
.
.
.
L512

我想将其内容更改为:

L1 | L2 | L3 | ... | L512

这看起来很容易,但现在我坐下来尝试制作它需要 1 小时,我尝试通过 sed 来完成,但没有得到我想要的。似乎 sed 只是在内容之间插入空行,有什么建议吗?

这是一个sed

sed ':a;N;s/\n/ | /g;ta' file
L1 | L2 | L3 | ... | L512

还有一个awk

awk '{printf("%s%s",sep,[=11=]);sep=" | "} END {print ""}' file
L1 | L2 | L3 | ... | L512

使用 sed 这需要将整个输入读入缓冲区,然后用 | 替换所有换行符,如下所示:

sed ':a;N;$!ba;s/\n/ | /g' input.txt

第 1 部分 - 缓冲输入

:a 定义了一个名为 'a' 的标签 N 从输入中获取下一行并将其附加到模式缓冲区 $!ba 跳转到 a 除非到达输入末尾

第 2 部分 - 用 |

替换换行符

s/\n/|/ 对模式缓冲区执行替换命令


如您所见,这是非常低效的,因为它需要:

  • 将完整的输入读入内存
  • 对输入进行三次操作:1.读取,2.代入,3.打印

因此我建议使用 awk,它可以在一个循环中完成:

awk 'NR==1{printf [=11=];next}{printf " | "[=11=]}END{print ""}' input.txt

几个选项,包括此处提到的选项:

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,[=10=]);sep=" | "} END {print ""}' file
perl -pe 's/\n/ |/g unless(eof)' file

如果 space 在 | 之间不是强制性的

tr "\n" '|' YourFile