该文件如下所示(一大行):
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
随着tr
和paste
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)
;
在行尾添加所需的分号
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)
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
)。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)