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

Cor*_*eta 4 text-processing

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

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......
Run Code Online (Sandbox Code Playgroud)

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

a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
etc....
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Pau*_*omé 18

随着trpaste

tr ';' '\n' < semicolons | paste -d';' - - - - -
Run Code Online (Sandbox Code Playgroud)

测试

$ 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
Run Code Online (Sandbox Code Playgroud)

双方trpaste在POSIX标准中规定。

;在行尾添加所需的分号

tr ';' '\n' < semicolons | paste -d';' - - - - - | sed s/$/\;/
Run Code Online (Sandbox Code Playgroud)

测试

$ 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;    
Run Code Online (Sandbox Code Playgroud)

  • 好一个。或者`tr';' '\n' &lt; 分号 | 粘贴 -sd';;;;\n'` (5认同)

Bar*_*ort 13

纯粹使用 GNUsed替换:

sed 's/\(\([^;]*;\)\{5\}\)/\1\n/g'
Run Code Online (Sandbox Code Playgroud)

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

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

例子:

$ 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......
Run Code Online (Sandbox Code Playgroud)

解释:

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

  • 您可以使用`-r`(GNU 选项)或`-E`(GNU 和POSIX 选项)跳过模式中的反斜杠。即`sed -E 's/(([^;]*;){5})/\1\n/g'` (3认同)

Rak*_*rma 5

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

$ sed -e 's/;/;\n/5;P;D' file 
Run Code Online (Sandbox Code Playgroud)

使用 Perl,使用分号作为字段分隔符,并以分号为 OFS 和最后一个空字段以 5 个一串打印,以打印尾随分号:

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

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

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