首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除文本末尾的换行符;在Automator中运行perl脚本

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

Stack Overflow用户
提问于 2020-05-18 00:23:17
回答 3查看 155关注 0票数 1

我正在编写一个perl脚本,它将在Automator应用程序中运行,以处理以前手动处理的文档。我需要每周做这个过程,总是与相同的垃圾数据删除。这些是rtf文件,在Mac OS X上使用另一个Automator脚本从html文件转换,以保持格式。我已经创建了一个新的快捷批处理脚本来处理rtf文件,以删除不必要的垃圾数据。

我的shell脚本是:

代码语言:javascript
复制
#!/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窗口中运行。

输入样本数据的格式如下:

代码语言:javascript
复制
Text1 Dateformat 
[Content1] 

Text2 Dateformat
[Content2]

Text3 Dateformat
[Content3]

上面的脚本生成输出:

代码语言:javascript
复制
[Content1]


[Content2]


[Content3]

所需输出的格式应为:

代码语言:javascript
复制
[Content1]

[Content2]

[Content3]

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

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

EN

回答 3

Stack Overflow用户

发布于 2020-05-18 22:14:03

您可以将空格作为模式的一部分进行匹配和删除。\Rgeneric line ending,它匹配任何Unicode行结尾,包括空白换行符或回车符/换行符对。另外,看一下数据的十六进制转储,看看真正的行尾是什么。老的Mac Classic的行尾似乎出现在奇怪的地方(但\R应该处理这一点)。

\h是水平空格:

代码语言:javascript
复制
#!/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得到垂直和水平空格:

代码语言:javascript
复制
#!/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字符串开始锚点:

代码语言:javascript
复制
#!/bin/sh
/usr/bin/perl -CSDA -ni -e 'print unless /\AText[123]\s+/i' "$@"
票数 1
EN

Stack Overflow用户

发布于 2020-05-18 05:17:56

此脚本的作用与一个线性程序相同

代码语言:javascript
复制
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]

输出

代码语言:javascript
复制
[Content1]

[Content2]

[Content3]

注意:将<DATA>替换为<>,以便从命令行上给定的管道或文件中读取

票数 0
EN

Stack Overflow用户

发布于 2020-05-18 04:55:26

代码语言:javascript
复制
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]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61855045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档