根据行的长度使用sed连接行

时间:2016-10-25 19:47:56

标签: awk sed concatenation

基本上,我想读取一个文件并将每一行连接到下一行,只要第一行的长度小于6(六是章的最大长度"数" 。)

16.
Chapter Name
17.
Chapter Name 
Appendix
A.1.
Appendix name
A.2.
Appendix name

在此示例中,输出为:

16. Chapter name
17. Chapter Name 
Appendix
A.1. Appendix name
A.2. Appendix name

使用此:

sed 'N;s/\n/ /'

结果:

16. Chapter Name
17. Chapter Name 
Appendix A.1.
Appendix name A.2.
Appendix name    

sed是否支持使用逻辑根据长度将线移动到保持缓冲区(或者它是否适合模式)?

awk会是更好的选择吗?

5 个答案:

答案 0 :(得分:1)

在awk中:

$ awk '{printf "%s", $0 (length($0)<6?" ":ORS)}' foo
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name

答案 1 :(得分:1)

使用sed:

$ sed -r 'N;/^(.){,5}\n/s/\n/ /;P;D' infile 
16. Chapter Name
17. Chapter Name 
Appendix
A.1. Appendix name
A.2. Appendix name
  • 扩展正则表达式(-r)刚刚使用,所以我没有必要输入\(.\)\{,5\}
  • N;P;D创建一个移动的两行窗口:N将下一行附加到模式空间,P打印模式空间的第一行,D删除它。
  • 如果模式空间在换行符之前包含五个或更少字符,则
  • /^(.){,5}\n/匹配
  • 如果匹配,s/\n/ /连接两行

此处不需要保留空间,但如果是,则可以根据其长度使用与此处使用的相同的正则表来复制模式空间。

答案 2 :(得分:1)

另一个sed解决方案

$ sed -E '/^.{,5}$/{N; s/\n/ /}' ip.txt 
16. Chapter Name
17. Chapter Name 
Appendix
A.1. Appendix name
A.2. Appendix name
  • /^.{,5}$/如果行最多包含5个字符
    • N;获取下一行
    • s/\n/ /将第一个\n替换为空格
  • 某些sed版本使用-r而不是-E来扩展正则表达式


另一个perl解决方案

$ perl -lpe '$_ .= " ".<> if length() < 6; chomp' ip.txt 
16. Chapter Name
17. Chapter Name 
Appendix
A.1. Appendix name
A.2. Appendix name
  • $_包含当前行
  • $_ .= " ".<> if length() < 6如果当前行少于6个字符,则附加空格和下一行
  • chomp删除$_中的结尾换行符。必需,因为<>获得的下一行将有\n个字符
  • -l选项会从输入行中删除结尾\n,并在打印时将其添加回来
  • -p在循环中迭代输入文件,默认情况下在所有命令结束时打印$_

答案 3 :(得分:0)

如果Perl是一个选项:

perl -pe 'chomp; $_.=(length()<6?" ":"\n")' file

chomp删除换行符
$_是当前行 三元? :运算符会附加空格或换行符

答案 4 :(得分:0)

awk 'sub(/\.$/,". "){printf $0;next}1' file

16. Chapter Name
17. Chapter Name 
Appendix
A.1. Appendix name
A.2. Appendix name