Files
devops/perl/perlonelinecn-master/05文本转化和替换.md
2025-09-17 16:08:16 +08:00

266 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文本转化和替换
## 63.ROT13化字串
'y/A-Za-z/N-ZA-Mn-za-m/'
本行代码使用y操作符或者页脚tr操作符做ROT13转化。y和tr操作做会对搜索列表的字符以替换列表对应位置的字符逐字替换。
本行代码A-Aa-z生成如下的字符列表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
而N-ZA-Mn-za-m 生成的列表为:
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
如果你观察的比较仔细的话就可以看出来第二行列表实际上和第一个列表偏移了13个字符。于是用y操作符把第一个列表所有字符用第二列表替换你正好就执行了ROT13操作。
如果你要对整个文件做ROT13
perl -lpe 'y/A-Za-z/N-ZA-Mn-za-m/' file
-p参数会把文件的每行都放到$_变量中y做ROT13操作在用-p输出$_out.-l参数附加一个换行符。
注意ROT13两次会得到同样的字符。例如ROT14ROT13string==string。
## 64.Base64加密
perl -MMIME::Base64 -e 'print encode_base64("string")'
本行代码使用MIME::Base64模块Perl核心自带无需额外安装。这个模块的encode_base64函数接受字串为参数对其做Base64加密。
如果对整个文件做加密,使用下面代码:
perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' file
此处-0777参数和-n用在一起导致Perl加载整个文件到$_变量。接着对其中base64加密就像上面的字串的例子一样的。
如果我们不加载整个文件,而是通过逐行加密的话结果会混乱。
## 65.base64解码
perl -MMIME::Base64 -le 'print decode_base64("base64string")'
MIME::Base64模块也有解码函数decode_base64.decode_base64函数接收base64加密的字串对其进行解码。
对这个文件解码也可以很简单:
perl -MMIME::Base64 -ne 'print decode_base64($_)' file
此处不需要加载整个文件到$_因为base64加密的文件每一行都恰好为76个字符很好解码。
## 66.对字串URL转码
perl -MURI::Escape -le 'print uri_escape($string)'
你需要安装另外URI::Escape模块这个模块输出两个函数uri_escape 和uri_unescape第一做url转码另一个做URL解码。
## 67.对字串URL解码
perl -MURI::Escape -le 'print uri_unescape($string)'
本行代码使用uri_unescape函数做URL解码。
## 68.对字串做HTML转码
perl -MHTML::Entities -le 'print encode_entities($string)'
本行代码使用HTML::Entities 模块的encode_entities函数。这个函数用来转码HTML实体。例如< >转化为&lt;&gt;
## 69.对字串做HTML解码
perl -MHTML::Entities -le 'print decode_entities($string)'
本行代码使用HTML::Entities 模块的deencode_entities函数。
## 70.所有文本大写
perl -nle 'print uc'
本行代码使用uc函数它默认对$_变量进行操作并且返回其大写形式。
另外一种方法是用-p命令行选项使其自动打印$_变量并且对其就地处理
perl -ple '$_=uc'
也可通过使用\U转义序列的方法达到同样的功能
perl -nle 'print "\U$_"'
这会让其后所有的字符(或者直到出现\E为止都大写。
## 71.所有文本小写
perl -nle 'print lc'
本行代码和前一例完全相似不过此处使用的lc函数爸$_的内容转化为小写。
或者,使用转义序列\L做字符改写
perl -nle 'print "\L$_"'
此处\L会让其后所有的字符或者直到出现\E为止都小写。
## 72.对每行的首字母大写
perl -nle 'print ucfirst lc'
本行代码使用lc函数使输入的转化为小写并利用ucfirst函数似的第一个字字符大写。
也能用转义码文本转换的方法实现同样的功能:
perl -nle 'print "\u\L$_"'
第一个\L使整行都小写\u使得第一个字符大写。
## 73.大小写转化
perl -ple 'y/A-Za-z/a-zA-Z/'
本行代码把大写字母A-Z转化为小写a-z而把小写字母大写从而实现了大小写转化。
## 74.每行进行驼峰大小写转化
perl -ple 's/(\w+)/\u$1/g'
这是一个差劲的驼峰表示法行代码。它会把每个单词的首字母都大写。对诸如“frieds car”会转化有误会把它转化为“ Friend'S Car”。
一个改进是:
s/(?<!['])(\w+)/\u\1/g
它会检查是否一个单词前的字符是不是单引号“’”。但是在某些更特殊的情况下它可能仍然会失败。
## 75.去除每行前面的空白(空格tab等)
perl -ple 's/^[ \t]+//'
本行代码删除了所有的每行前面的所有空格。他使用替换操作符s。对一个模式s/REGEX/REPLACE/会把匹配的REGEX用REPLACE字串代替。在本例中REGEX是^[ \t]+,意思是在字符串的开始匹配一个或者更多个空格或者tabREPLACE为空意思是把匹配部分替换为空字串删除
正则类[ \t]实际上可以用\s+来替换,\s+匹配任何的空格包括tabs和空格
perl -ple 's/^\s+//'
## 76.删除每行的每行末的空白
perl -ple 's/[ \t]+$//'
本行代码删除了每行末所有空白字符。
## 77.删除每行开始和结束的空白
perl -ple 's/^[ \t]+|[ \t]+$//g'
本行代码结合了前面两例。注意到,它给操作符指定了全局的/g标记。这是必须的由于我们期望删掉开始和结束的空白。如果我们不指定他将只能删除开始的假设存在的话而不会删除最后的。
## 77.转化Unix换行符为DOS/Windows换行符
perl -pe 's|\n|\r\n|'
本行代码替换Unix换行符\n LF为windows换行符\r\n CRLF。记住s操作符可以使用任何字符作为分隔符。本行代码用竖线作为分隔符以增加代码的可读性。
## 78.转化DOS/Windows换行符为UNIX换行符。
perl -pe 's|\r\n|\n|'
本行代码做了前一例的逆操作。操作window 换行发CRLF,并把它转化为换行符LF。
## 79.转化Unix换行符为Mac换行符。
perl -pe 's|\n|\r|'
苹果使用\r CR作为换行符。本行代码转化Unix的LF为苹果的CR。
## 80.替换行中foo为bar查找替换
perl -pe 's/foo/bar/'
本行代码使用s/REGEX/REPLACE/对每行中foo的替换为bar
替换行中所有foo为bar则需要增加/g标记
perl -pe 's/foo/bar/g'
## 81.替换匹配“baz”的行中的foo为bar
perl -pe '/baz/ && s/foo/bar/'
本行代码等价于:
while (defined($line = <>)) {
if ($line =~ /baz/) {
$line =~ s/foo/bar/
}
}
他先检查每行是否匹配“baz”如果匹配则替换行中foo为bar。
## 82.逆序输出段落
perl -00 -e 'print reverse <>' file
本行代码使用了-00参数这在例7讨论过用来开启大段落模式意味着Perl将通过段落的方式读取文本而不是默认的按行的方式。接着使用<>操作符使得Perl用指定的文件或者标准输入获得输入。本处我们指定file作为参数所以Perl读取file的文本段落由于-00。当Perl读完文件它将所有段落作为一个列表返回并且调用reverse函数颠倒段列表的顺序。最后打印出反序的段落列表。
## 83.逆序输出所有行
perl -lne 'print scalar reverse $_'
本行代码在标量上下文下reverse操作。在上一例中对整个列表在在列表上下文中执行reverse结果是对列表元素顺序进行反序。对标量变量比如包含整行的$_你要实现同样的功能必须在标量上下文进行reverse操作。否则它执行的将会对一个元素的列表rreverse得到结果还会是他自己作为操作后打印出反序的行。你可以去掉代码中$_执行结果一样的。因为reverse默认的变量就是$_。换句话说行代码可以写为
perl -lne 'print scalar reverse'
或者你可以用-p替换-n修改$_变量使其值为倒序
perl -lpe '$_ = reverse $_'
也可以简写为:
perl -lpe '$_ = reverse'
要说明的是在Perl的操作符如果没有指定参数的话大多数情况下默认都是对$_操作。
## 84.以逆序方式打印列
perl -alne 'print "@{[reverse @F]}"'
本行代码对文件中的列逆序转化。-a命令行参数用空格为分隔符切割每一行为列并存在@F数组中。接着对其逆序并且打印。
本行代码在以有过类似的例子,@{[...]}结果,为了解释其作用,我们假设在其中插入了双引号,给予下面的输入文件:
one two three four
five six seven eight
其输出为:
four three two one
eight seven six five
如果输入的行的各列直接不是空格而是其他的分隔符,则我们必须用-F命令行设置为特殊的字符如果给输入文件为
one:two:three:four
five:six:seven:eight
这我们增加-F:参数,给行代码:
perl -F: -alne 'print "@{[reverse @F]}"'
它的输出为:
four three two one eight
seven six five
注意到,在输出的时候没有带:字符,为了使其带上,我们需要对本行修改,设置$”变量为“:”,如下:
perl -F: -alne '$" = ":"; print "@{[reverse @F]}"'
他会输出我们所期望的结果:
four:three:two:one
eight:seven:six:five
变量$”用于改变在双引号环境下对数组进行变量内插打印时元素间默认的分割字符(空格)。