我正在编写一个perl脚本,它将在Automator应用程序中运行,以处理以前手动处理的文档。我需要每周做这个过程,总是与相同的垃圾数据删除。这些是rtf文件,在Mac OS X上使用另一个Automator脚本从html文件转换,以保持格式。我已经创建了一个新的快捷批处理脚本来处理rtf文件,以删除不必要的垃圾数据。
我的shell脚本是:
#!/bin/bash
#
# replace CR with CRLF
#
/usr/bin/perl -CSDA -pi <<'EOF' - "$@"
s/dateformat//og;
s/text1//og;
s/text2//og;
s/text3//og;
s///og;
EOF这就解决了99%需要做的事情。但是,最终的文件会出现多余的换行符。有没有办法让text1,text2等的替换包括删除后面的换行符?我唯一的限制是它必须能够在Automator脚本shell窗口中运行。
输入样本数据的格式如下:
Text1 Dateformat
[Content1]
Text2 Dateformat
[Content2]
Text3 Dateformat
[Content3]上面的脚本生成输出:
[Content1]
[Content2]
[Content3]所需输出的格式应为:
[Content1]
[Content2]
[Content3]在原始文档中,内容块后有一个换行符,然后是Text1和Dateformat。

处理之后,Text1和Dateformat被删除,但正如您所看到的,现在内容块之间有两个换行符。

发布于 2020-05-18 22:14:03
您可以将空格作为模式的一部分进行匹配和删除。\R是generic line ending,它匹配任何Unicode行结尾,包括空白换行符或回车符/换行符对。另外,看一下数据的十六进制转储,看看真正的行尾是什么。老的Mac Classic的行尾似乎出现在奇怪的地方(但\R应该处理这一点)。
\h是水平空格:
#!/bin/bash
#
# replace CR with CRLF
#
/usr/bin/perl -CSDA -pi <<'EOF' - "$@"
s/dateformat\R//ig;
s/text1\h+//ig;
s/text2\h+//ig;
s/text3\h+//ig;
EOF注意,我添加了不区分大小写的/i标志,因为您的模式都是小写的,但是数据大小写混合。
我还删除了no longer does anything的/o开关。
如果有什么原因你要删除DateFormat本身,你可以删除Textn后面的所有空格。\s得到垂直和水平空格:
#!/bin/bash
#
# replace CR with CRLF
#
/usr/bin/perl -CSDA -pi <<'EOF' - "$@"
s/dateformat//ig;
s/text1\s+//ig;
s/text2\s+//ig;
s/text3\s+//ig;
EOF如果您只想跳过这些行,您甚至不需要进行替换。无论它们是否具有DateFormat位,您都可以跳过它们。它使用-n而不是-p,所以我可以控制它什么时候输出。为了更好地衡量,我已经添加了\A字符串开始锚点:
#!/bin/sh
/usr/bin/perl -CSDA -ni -e 'print unless /\AText[123]\s+/i' "$@"发布于 2020-05-18 05:17:56
此脚本的作用与一个线性程序相同
use strict;
use warnings;
use feature 'say';
my $data = do { local $/; <DATA> };
$data =~ s/Text\d+\s+Dateformat\s*//g;
say $data;
__DATA__
Text1 Dateformat
[Content1]
Text2 Dateformat
[Content2]
Text3 Dateformat
[Content3]输出
[Content1]
[Content2]
[Content3]注意:将<DATA>替换为<>,以便从命令行上给定的管道或文件中读取
发布于 2020-05-18 04:55:26
use strict;
use warnings;
use Data::Dumper;
my $record = {};
my ( $key, $val );
while ( my $row = <DATA> ) {
chomp( $row );
next if !$row;
if ( $row =~ /Dateformat/ ) {
( $key, undef ) = split /\s+/, $row;
print "$key\n";
} elsif ( $row =~ /\[/ ) {
$record->{$key} = $row;
}
}
print Dumper($record);
__DATA__
Text1 Dateformat
[Content1]
Text2 Dateformat
[Content2]
Text3 Dateformat
[Content3]https://stackoverflow.com/questions/61855045
复制相似问题