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