批处理或perl重塑txt文件

批处理或perl重塑txt文件,perl,text,batch-file,Perl,Text,Batch File,我想编写一个脚本,重新塑造文本文件的形状,如下所示: word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 ... 为此: word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 ... 有人知道这样做的简单方法吗 perl -l -00 -aF/\s*\n\s*/ -ne 'print "@F"'

我想编写一个脚本,重新塑造文本文件的形状,如下所示:

word1
word2
word3
word4

word5
word6
word7
word8

word9
word10
word11
word12
...
为此:

word1 word2 word3 word4
word5 word6 word7 word8
word9 word10 word11 word12
...
有人知道这样做的简单方法吗

perl -l -00 -aF/\s*\n\s*/ -ne 'print "@F"' /source/file > /dest/file
说明(使用TLP的建议)

  • -l:自动咀嚼记录并使
    打印
    表现得像
  • -00:将perl置于“段落模式”,并查找连续的“\n\n”
  • -a:自动将记录拆分为字段数组
    @F
  • -F:使用以下模式拆分记录(使用自动拆分)
  • -ne:对每条记录执行以下操作(以“\n\n”分隔),仅在被告知时打印
说明(使用TLP的建议)

  • -l:自动咀嚼记录并使
    打印
    表现得像
  • -00:将perl置于“段落模式”,并查找连续的“\n\n”
  • -a:自动将记录拆分为字段数组
    @F
  • -F:使用以下模式拆分记录(使用自动拆分)
  • -ne:对每条记录执行以下操作(以“\n\n”分隔),仅在被告知时打印

看来你的小组是“段落”,所以就这样读吧;在空白处拆分单词;使用单个空格(空白)重新加入并打印结果:

#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '';
my @words;
while (<DATA>) {
    @words = split;
    print join q( ), @words, "\n";
    @words = ();
}
__DATA__
word1
word2
word3
word4

word5
word6
word7
word8

word9
word10
word11
word12
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='';
我的文字;
而(){
@文字=分裂;
打印join q(),@words,“\n”;
@单词=();
}
__资料__
字1
字2
字3
字4
字5
字6
字7
字8
字9
字10
字11
字12

看来你的小组是“段落”,所以就这样读吧;在空白处拆分单词;使用单个空格(空白)重新加入并打印结果:

#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '';
my @words;
while (<DATA>) {
    @words = split;
    print join q( ), @words, "\n";
    @words = ();
}
__DATA__
word1
word2
word3
word4

word5
word6
word7
word8

word9
word10
word11
word12
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='';
我的文字;
而(){
@文字=分裂;
打印join q(),@words,“\n”;
@单词=();
}
__资料__
字1
字2
字3
字4
字5
字6
字7
字8
字9
字10
字11
字12
  • -i.bak
    将备份保存在
    input.txt.bak
  • -p
    在脚本周围放置一个while()循环
  • 正则表达式查找以非空白字符结尾的行 不后跟空格,后跟换行符并替换 带空格的换行符。
    \K
    转义的意思是“在此之前保留任何内容”
另一种选择:

perl -i.bak -lpwe 'BEGIN { $/="" }; s/\n/ /g' input.txt
在开始块中使用段落模式,并在每次打印后换行
-l

  • -i.bak
    将备份保存在
    input.txt.bak
  • -p
    在脚本周围放置一个while()循环
  • 正则表达式查找以非空白字符结尾的行 不后跟空格,后跟换行符并替换 带空格的换行符。
    \K
    转义的意思是“在此之前保留任何内容”
另一种选择:

perl -i.bak -lpwe 'BEGIN { $/="" }; s/\n/ /g' input.txt


在BEGIN块中使用段落模式,在每次打印后使用带有
-l

的换行符,一个不长的可读脚本会很好:)
-l
不仅会选择输入,还会在
打印
中添加一个换行符。此外,还可以查看
-a
-F
;)TLP是对的,如果
-l
已经存在,那么就不需要
,这是一个有趣的解决方案。我没有意识到
-00
是段落模式,但它也必须做一些其他的事情,因为
-00-lpwe的/\n//g'
不会给出与
-lpwe'BEGIN{$/=“”]相同的结果;s/\n//g;'perl-l-00
给出了正确的结果,但是
perl-00-l
添加了一个额外的换行符。这意味着
-l
将添加到现有的
$\
,而不是覆盖它。一个不长的可读脚本会很好:)
-l
不仅会选择输入,还会在
打印中添加新行。此外,还可以查看
-a
-F
;)TLP是对的,如果
-l
已经存在,那么就不需要
,这是一个有趣的解决方案。我没有意识到
-00
是段落模式,但它也必须做一些其他的事情,因为
-00-lpwe的/\n//g'
不会给出与
-lpwe'BEGIN{$/=“”]相同的结果;s/\n//g;'perl-l-00
给出了正确的结果,但是
perl-00-l
添加了一个额外的换行符。这意味着
-l
将添加到现有的
$\
而不是覆盖它。对于包含空格的行不起作用。例如“word1 word2\n…”。它可以工作,但它会用空格替换任何空格,最好是在
\n
上进行拆分。对于包含空格的行不起作用。例如“word1 word2\n…”。它会起作用,但它会用空格替换任何空格,最好是在
\n
上进行拆分。这是我第一次看到
\K
标志起作用。这样就不需要可变长度-lookbehind@Zaid它与lookbehind Nice位于同一位置。与许多Perl特性一样,这个小金块对于know@Zaid我想知道为什么不支持可变长度查找。这是我第一次看到
\K
标志起作用。这样就不需要可变长度-lookbehind@Zaid它与lookbehind Nice位于同一位置。与许多Perl特性一样,这个小金块对于know@Zaid我想知道为什么不支持可变长度查找。