如何在文本文件中每 5 个第五个分号 (;) 后添加一个换行符

如何在文本文件中每 5 个第五个分号 (;) 后添加一个换行符

该文件如下所示(一大行):

a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a; etc......

现在我想剪切文本并在每五个分号 ( ) 之后换行,;所以它看起来像这样:

a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
etc....

我该怎么做呢?

答案1

trpaste

tr ';' '\n' < semicolons | paste -d';' - - - - -

测试

$ cat semicolons
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a

$ tr ';' '\n' < semicolons | paste -d';'  - - - - -
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a

两个都trpaste在 POSIX 标准中指定。

;在行尾添加所需的分号

tr ';' '\n' < semicolons | paste -d';' - - - - - | sed s/$/\;/

测试

$ tr ';' '\n' < semicolons | paste -d';' - - - - - | sed s/$/\;/
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;    

答案2

纯粹使用 GNUsed替换:

sed 's/\(\([^;]*;\)\{5\}\)/\1\n/g'

或者不使用所有转义反斜杠-E(感谢@JoL):

sed -E 's/(([^;]*;){5})/\1\n/g'

例子:

$ cat test.txt
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a; etc......

$ cat test.txt | sed 's/\(\([^;]*;\)\{5\}\)/\1\n/g'
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a; etc......

解释:

  • \([^;]*;\):正则表达式捕获组匹配所有字符(包括分号)。
  • \(\([^;]*;\)\{5\}\):正则表达式捕获匹配上述五次出现的组。在sed命令中,这将匹配到\1.
  • s/\(\([^;]*;\)\{5\}\)/\1\n/g:用自身( ) 替换五次出现的所有字符(包括分号 ( ) )中的s/每一次出现( ) ,但后跟换行符 ( )。/g\(\([^;]*;\)\{5\}\)\1\n

答案3

Sed 编辑器方法我们在第 5 个分号后放置一个换行符,打印到换行符,删除直到换行符,冲洗 n 重复,直到用完模式空间。

$ sed -e 's/;/;\n/5;P;D' file 

使用 Perl,使用分号作为字段分隔符,并以 5 个为一串进行打印,分号作为 OFS,末尾有一个空字段,以打印尾随的分号:

$ perl -F\; -lane '$,=";";
     print splice(@F, 0, 5), q() while @F;
' file 

使用 Awk,我们查看一堆 5 个字段,并在前 4 个字段后附加一个分号,在第五个字段后附加分号 + 换行符。然后打印字段并用 null 分隔它们:

$ awk -F\; -vOFS= '{
        for(i=1; i<=NF; i++)
            $(i) = $(i) (i%5 ? FS : FS RS)
  }1' file

答案4

我发现虽然正则表达式适合此类任务,但为了视觉帮助和简单性,我总是使用文本编辑器宏来完成此任务。

使用vim,你可以

set textwidth=20

或类似的低和

set wrap

如果文件确实需要编辑,可以使用一个简单的宏,例如

qqf;f;f;f;f;i\n99999@q

会做的。

相关内容