如何在perl中的每第n个分隔符实例后添加换行符

如何在perl中的每第n个分隔符实例后添加换行符

我正在编写一个脚本,该脚本将打开文件 data.txt 并在“|”的每个 n 个实例之后添加换行符分隔符,以便每一行包含一个具有所有四个变量的观察值。基本上将一条线从宽到长分开并重塑。感谢您的帮助。

输入:

a1|b1|c1|d1|a2|b2|c2|d2|a3|b3|c3|d3|a4|b4|c4|d4

输出:

a1|b1|c1|d1|   
a2|b2|c2|d2|   
a3|b3|c3|d3|  
a4|b4|c4|d4

答案1

你可以这样做:

perl -pe 's/(.*?\|){4}\K/\n/g'

答案2

使用 Sed:

便携:

sed -e 's/|/&\
/4;P;D' file

如果您使用 GNU Sed,则可以使用非标准\n来表示替换模式中的换行符:

sed -e 's/|/&\n/4;P;D' file

该命令在模式空间中的s第四个之后插入换行符。|

P命令打印模式空间中的第一个换行符。

D命令最多从模式空间中删除第一个换行符。

如果没有进行替换(|模式空间中少于四个字符),则模式空间将不包含任何换行符 - 因此该P命令将打印全部的模式空间,该D命令将删除整个模式空间,然后读入文件中的下一行并重新开始循环。

答案3

tr 并粘贴,而不是您的确切输出

tr '|' '\n' <file | paste -d'|' - - - -
a1|b1|c1|d1
a2|b2|c2|d2
a3|b3|c3|d3
a4|b4|c4|d4

awk

awk -F'|' -v OFS='|' -v n=4 '{for (i=n+1; i<=NF; i+=n) $i = "\n" $i; print}' file
a1|b1|c1|d1|
a2|b2|c2|d2|
a3|b3|c3|d3|
a4|b4|c4|d4

相关内容