[英]Delete line break at end of text; running a perl script inside of Automator
我正在编写一个 perl 脚本,它将在 Automator 应用程序内部运行,以处理以前手动处理的文档。 我需要每周执行此过程,始终删除相同的垃圾数据。 这些是 rtf 文件,使用另一个 Automator 脚本从 Mac OS X 上的 html 文件转换而来以保持格式。 我创建了一个新的 Droplet 脚本来处理 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 window 中运行。
输入示例数据的格式如下:
Text1 Dateformat
[Content1]
Text2 Dateformat
[Content2]
Text3 Dateformat
[Content3]
上面的脚本生成 output:
[Content1]
[Content2]
[Content3]
所需的 output 格式应为:
[Content1]
[Content2]
[Content3]
在原始文档中,内容块之后有一个换行符,然后是Text1
和Dateformat
。
处理后, Text1
和Dateformat
被删除,但如您所见,内容块之间现在有两个换行符。
您可以将空格作为模式的一部分进行匹配和删除。 \R
是通用行结尾,它匹配任何 Unicode 行结尾,包括一个空换行符或一个回车/换行符对。 另外,查看数据的 hexdump 以了解真正的行尾是什么。 旧的 Mac 经典行结尾似乎出现在奇怪的地方(但\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
标志,因为您的模式都是小写的,但数据是大小写混合的。
我还删除了/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' "$@"
此脚本与一个班轮的作用相同
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]
Output
[Content1]
[Content2]
[Content3]
注意:将<DATA>
替换为<>
以从 pipe 或命令行上给出的文件读取
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.