相关文章推荐
任性的黑框眼镜  ·  NameError: name ...·  3 周前    · 
风流的板凳  ·  Student-resources | 五一导航·  3 月前    · 

Unix管理员可以使用许多非常好的脚本语言,但是Perl仍然是我最喜欢的语言之一,它可以用于处理任何涉及正则表达式的工作——任何可以用模式描述的文本。如果您想要定位或更改匹配某些特定规范的文本块,您可以用Perl编写一个脚本,它将相当容易地完成这项工作。在本周的文章中,我们将研究一些针对常见问题的简单修复方法,这些方法利用了Perl的多用途特性。

删除空白行
第一个技巧是删除空白行。在Perl中,识别空白行是很容易的。因为^代表一行的开始,$代表一行的结束,^$代表一行的开始和结束,中间没有任何东西。通过将表达式更改为^\s*$,可以将其展开以匹配包含空格的行。表示“空白”,所以\s*匹配零个或多个空白字符。

要跳过perl脚本中的空白行,有几种选择。你可以使用"next if /^$/"(空时跳过)命令或者"next if /^\s*$/"(空时跳过)命令。另一种方法是,只在(/\S/)(有文本时打印)或在(!^$)(非空时打印)时打印。

这个脚本块将只显示包含文本的行,跳过空白行:

While () {next if /^\s*$/;#跳过空行打印;}

这个只会打印包含文本的行:

while () {print if (/\S/;}

这段代码只显示不为空的行:

While () {print if (!/^$/);# print only if NOT empty}

这个简单的一行程序删除了空白行,但也将原始文件保存到.old。新文件(没有空行的文件)采用原始文件名。

perl - i。-n -e "print if /\S/"文件名

你可以把它变成一个脚本:

# !/bin/bash if [-f "$1"];然后perl - i。"print if /\S/" $1 fi

或一个别名:

别名deblank = ' perl - i。旧-n -e "print if /\S/"'

删除行首和行尾的空白
删除行开头或结尾的空格可以减少您需要考虑的选项,从而促进后面的处理。

删除前导空格:

$ string = ~ s / ^ \ s + / /

删除尾随空格:

$ string = ~ s / \ s + / /美元

删除非ascii字符
删除不属于传统ASCII字符集范围的字符有点棘手。在下面的命令中,我们使用perl tr命令将十六进制80(十进制128)到十六进制FF(十进制255)之间的字符范围映射并删除它们(d)。如果您使用扩展字符集,这将对您没有用处。

$ string = ~ tr / \ x80 - \ xFF / / d;

删除回车
在使用perl时,表达式\r表示一个回车,而\n是一个换行。可以很容易地从字符串变量中删除回车,如下所示。

美元str = ~ s / \ r / g;

当然,回车和换行是通过按这个顺序组合\r和\n来删除的,因为这是它们在文本文件中出现的顺序,就像在Windows系统上创建的文本文件一样。

$ str = ~ s / \ r \ n / / g;

这一行代码使用相同的逻辑删除文件中的回车:

Perl -p -i -e 's/\r//g

如果没有像dos2unix这样的工具,这将特别方便。另外,我非常喜欢带有“pie”(-p -i -e)参数的perl命令的“就位”(不涉及临时文件或副本)特性。它很容易变成一个别名:

perl -p -i -e '\ " s/\r/ g'\ " '

添加行号
要在文件的内容中添加行号,可以这样做:

Perl -p -i -e '$_ = "$. "$ _“myfile

这一点需要一点解释。美元的。变量包含行号,因此命令会读取“将该行更改为行号之前的行”。

替换文本
Perl pie命令使得替换文件中的文本相当容易,但是您应该始终小心,不要随希望更改的文本一起更改您不想更改的文本。

Perl -p -i -e 's/2011/2012/g'文件名

重命名文件
该命令将文件重命名为对应的小写字符。将此理解为“对于提供的每个参数(即文件列表“*”),将文件重命名为小写,除非已经存在同名的文件”。

@ argv perl - e”(){重命名$ _,lc($ _)除非- e lc ($ _);}‘*

当然,你也可以用大写字母做同样的事情,用uc代替lc
的位置。