如何放置 |在文本文件的内容行之间?
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
我有一个文件包含:
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