基本上,我想读取一个文件并将每一行连接到下一行,只要第一行的长度小于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会是更好的选择吗?
答案 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