如何从终端中的文件运行perl regex列表

时间:2019-01-21 16:52:23

标签: regex macos perl terminal

我是整个编码游戏的新手,非常感谢每个答案!

我正在其中包含许多.txt文件的目录中工作,并且有一个包含正则表达式的完整列表的文件,例如"perl -p -i -e 's/\n\n/\n/g' *.xml",如果我将它们复制到终端,它们都可以工作。但是有可能直接从文件中运行它们吗? 我尝试了./unicode.sh,但结果是:

  

没有这样的文件或目录。

有什么想法吗?

非常感谢您!

2 个答案:

答案 0 :(得分:3)

以下是与oneliner perl -p -i -e 's/\n\n/\n/g' *.xml等效的Perl脚本(主要是等效的)(主要区别是已启用strictwarnings,强烈建议使用),您可以对其进行扩展通过添加更多代码来修改while循环主体中的当前行。

#!/usr/bin/env perl
use warnings;
use strict;

if (!@ARGV) {               # if no files on command line
    @ARGV = glob('*.xml');  # get a default list of files
}
local $^I = '';             # enable inplace editing (like perl -i)
while (<>) {                # read each line of each file into $_
    s/\n\n/\n/g;            # modify $_ with a regex
    # more regexes here...
    print;                  # write the line $_ back out
}

您可以将此脚本保存在process.pl之类的文件中,然后使用perl process.pl运行它,或者执行chmod u+x process.pl然后通过./process.pl运行它。

另一方面,您确实shouldn't modify XML files with regular expressions,有很多Perl模块可以进行XML处理-我写了更多的here。另外,在您显示的示例中,s/\n\n/\n/g实际上不会产生任何影响,因为当逐行读取文件时,没有字符串将包含两个\n(您可以更改Perl的读取方式文件,但我在问题中看不到任何提及。)

编辑:您已在示例unicode.sh中为脚本命名-如果您正在处理Unicode文件,则Perl具有非常强大的功能来帮助您完成此任务,尽管可以赢得代码最终不一定像我上面显示的那样好看又短。您必须告诉我们更多有关您正在做的事情,并显示一些示例输入和输出,以获取有关此操作的建议。另请参见perlunitut

答案 1 :(得分:2)

如果您没有这样的文件或目录,很可能是因为忘记了unicode.sh的可执行性,就像在chmod +x unicode.sh中一样,假设这是您编写的脚本。

当然,运行多个perl命令的正常方法是看起来像您编写的runme.pl,即perl脚本。

也就是说,是的,所有内容都可以在终端上正常工作,您只需要注意转义bash所执行的操作即可。