Awk 基于行的长度将行与sed连接
本质上,我想读取一个文件并将每一行连接到下一行,前提是第一行的长度小于6。(六是章节“编号”的最大长度。) 在本例中,输出为:Awk 基于行的长度将行与sed连接,awk,sed,concatenation,Awk,Sed,Concatenation,本质上,我想读取一个文件并将每一行连接到下一行,前提是第一行的长度小于6。(六是章节“编号”的最大长度。) 在本例中,输出为: 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. Appendi
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是更好的选择吗?在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
$awk'{printf“%s”,awk中的$0(长度($0):
$ awk '{printf "%s", $0 (length($0)<6?" ":ORS)}' foo
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$awk'{printf”%s',$0(长度($0),带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
打印模式空间的第一行,并将其删除
- 如果模式空间在换行之前包含五个或更少的字符,则匹配
- 如果匹配,
s/\n/
将连接这两行
此操作不需要保留空间,但如果需要保留空间,则可以使用此处使用的相同正则表达式根据其长度复制模式空间。使用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
打印模式空间的第一行,并将其删除
- 如果模式空间在换行之前包含五个或更少的字符,则匹配
- 如果匹配,
s/\n/
将连接这两行
此操作不需要保留空间,但如果需要保留空间,则可以使用此处使用的相同正则表达式根据其长度复制模式空间。如果Perl是一个选项:
perl -pe 'chomp; $_.=(length()<6?" ":"\n")' file
perl-pe'chomp;$\ux.=(length()如果perl是一个选项:
perl -pe 'chomp; $_.=(length()<6?" ":"\n")' file
perl-pe'chomp;$.=(length()另一个sed
解决方案
$ sed -E '/^.{,5}$/{N; s/\n/ /}' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$ perl -lpe '$_ .= " ".<> if length() < 6; chomp' 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
解决方案
$ sed -E '/^.{,5}$/{N; s/\n/ /}' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$ perl -lpe '$_ .= " ".<> if length() < 6; chomp' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$perl-lpe'$\.=''.if length()<6;chomp'ip.txt
16.章名
17.章名
附录
A.1.附录名称
A.2.附录名称
$包含当前行
$。=''。如果当前行少于6个字符,则添加空格和下一行
chomp
删除$\ucode>中的结尾新行字符(如果存在)。这是必需的,因为
获得的下一行将具有\n
字符
-l
选项从输入行中删除结尾\n
,并在打印时将其重新添加
-p
在循环中迭代输入文件,默认情况下,所有命令的末尾都会打印$\ucode>值
另一种sed
解决方案
$ sed -E '/^.{,5}$/{N; s/\n/ /}' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$ perl -lpe '$_ .= " ".<> if length() < 6; chomp' 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
解决方案
$ sed -E '/^.{,5}$/{N; s/\n/ /}' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$ perl -lpe '$_ .= " ".<> if length() < 6; chomp' ip.txt
16. Chapter Name
17. Chapter Name
Appendix
A.1. Appendix name
A.2. Appendix name
$perl-lpe'$\.=''.if length()<6;chomp'ip.txt
16.章名
17.章名
附录
A.1.附录名称
A.2.附录名称
$包含当前行
$。=''。如果当前行少于6个字符,则添加空格和下一行
chomp
删除$\ucode>中的结尾新行字符(如果存在)。这是必需的,因为
获得的下一行将具有\n
字符
-l
选项从输入行中删除结尾\n
,并在打印时将其重新添加
-p
在循环中迭代输入文件,默认情况下,所有命令的末尾都会打印$\ucode>值
sed不是完成该任务的合适工具,使用awk代替sed不是完成该任务的合适工具,使用awk代替sed太棒了!非常感谢Brown先生!非常感谢您。只希望您使用OFS而不是硬编码“”:printf“%s%s”,$0,(长度($0)@EdMortonOFS
由于代码将章节名称与章节编号连接在一起,我无法在它们之间找到任何其他分隔符,因此被排除在外。关于%s
与%s
的比较,这是一个很好的示例,从未真正考虑过(但必须使用“
尝试第一个)。太棒了!非常感谢布朗先生。只希望您使用OFS而不是硬编码“”:printf“%s%s”,$0,(长度($0)@EdMortonOFS
由于代码将章节名称与章节编号连接在一起,我无法在它们之间找到任何其他分隔符,因此被排除在外。关于%s
与%s
的比较,这是一个很好的示例,从未真正考虑过(但必须使用“
尝试第一个)。虽然此代码段可能会解决问题,包括提高文章质量的解释。请记住,您是在将来为读者回答问题,而不仅仅是现在提问的人!请在回答时添加解释,并说明适用的限制和假设。而此代码段可能会解决问题,包括一个解释,以提高你的文章质量。记住,你回答的问题是未来的读者,而不仅仅是提问的人