繁体   English   中英

删除文本末尾的换行符; 在 Automator 中运行 perl 脚本

[英]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]

在原始文档中,内容块之后有一个换行符,然后是Text1Dateformat

原始文件

处理后, Text1Dateformat被删除,但如您所见,内容块之间现在有两个换行符。

使用上面的 Automator droplet 处理后的文档

您可以将空格作为模式的一部分进行匹配和删除。 \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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM