Awk 基于行的长度将行与sed连接

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

本质上,我想读取一个文件并将每一行连接到下一行,前提是第一行的长度小于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.
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)@EdMorton
OFS
由于代码将章节名称与章节编号连接在一起,我无法在它们之间找到任何其他分隔符,因此被排除在外。关于
%s
%s
的比较,这是一个很好的示例,从未真正考虑过(但必须使用
尝试第一个)。太棒了!非常感谢布朗先生。只希望您使用OFS而不是硬编码“”:
printf“%s%s”,$0,(长度($0)@EdMorton
OFS
由于代码将章节名称与章节编号连接在一起,我无法在它们之间找到任何其他分隔符,因此被排除在外。关于
%s
%s
的比较,这是一个很好的示例,从未真正考虑过(但必须使用
尝试第一个)。虽然此代码段可能会解决问题,包括提高文章质量的解释。请记住,您是在将来为读者回答问题,而不仅仅是现在提问的人!请在回答时添加解释,并说明适用的限制和假设。而此代码段可能会解决问题,包括一个解释,以提高你的文章质量。记住,你回答的问题是未来的读者,而不仅仅是提问的人