使用 Perl 设置文件内容的格式

使用 Perl 设置文件内容的格式

我有一个具有以下格式的文件:

>Country1 
Aus
trali
a

>Country5
Swi
tzer
land

>Country2
Net
herland
s

我想输出以下格式的文件:

>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

答案1

直接Perl解决方案:

$ perl -lne '
    if(/^>/) {printf "%s ", $_;next}
    if(/^$/) {printf "\n";next}
    printf "%s", $_;
' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

或者更短的方式:

$ perl -ane 'BEGIN{$/="";};print "$F[0] ",@F[1..$#F],"\n"' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

设置$/为空字符串会导致 Perl 切换到段落模式,这意味着记录分隔符是一个或多个空行。

答案2

使用-p转变逐行处理文件并输出每个处理后的行。如果该行以 开头,则将换行符替换为空格>;如果该行以另一个非换行符开头(即,如果它不为空),则将其替换为空。

perl -pe 'if (/^>/) {s/\n/ /} elsif (/^./) {s/\n//}'

答案3

使用 Raku(以前称为 Perl_6)

raku -ne 'print "$_ " if m/^\>/; .print if m/<alpha>+ $/; .put unless .chars;'  

输入示例:

>Country1
Aus
trali
a

>Country5
Swi
tzer
land

>Country2
Net
herland
s

示例输出:

>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

感谢@Gilles,他能够在 Perl 中通过单个 if/else 语句来完成此操作。上面的代码使用了三个 Raku 语句,利用了print和之间的差异put。在 Raku 中,print不添加换行符,而在putRaku 中添加换行符。此外,在 Raku 中,~波形符用于字符串连接,因此插值"$_ "可以写成$_~" "

Raku 对于同源问题的一个(可能?)优势是chars例程的严格 Unicode 实现(NFG 规范化)。请参阅底部的网址。

https://6guts.wordpress.com/2015/04/12/this-week-unicode-normalization-many-rts/
https://docs.raku.org/routine/chars
https://raku.org

答案4

如果输入行中没有选项卡,您可以使用此方法:

$ awk NF infile | awk '{$1=$1};1' | paste - - - - | sed 's/ //2g'
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

第一个 awk 删除空行。第二个 awk 修剪前导/尾随空格。粘贴命令(带有四个连字符)合并由制表符分隔的每四行。最后 sed 删除不需要的选项卡。如果您愿意,请将第一个选项卡替换为空格。

相关内容