怎么放|文本文件的内容行之间?

时间:2015-01-22 11:20:01

标签: sed

我有一个包含以下内容的文件:

L1
L2
L3
.
.
.
L512

我想将其内容更改为:

L1 | L2 | L3 | ... | L512

看起来很容易,但是现在我坐了1个小时并尝试制作它,我试着用sed做,但没有得到我想要的东西。看来sed只是在内容之间插入空行,有什么建议吗?

5 个答案:

答案 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/|/在模式缓冲区

上执行substitute命令

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

  • 将完整的输入读入内存
  • 在输入上操作三次:1。阅读,2。替换,3。打印

因此我建议使用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
相关问题