[英]How do I append text to the line containing a substitution in Perl?
我的目标是用它们对应的值替换*.bas
文件中的所有命名常量,然后 append 对带有值-常量对的行的注释以供将来参考。
例如,我想更改这一行:
Print #lngFile, rst.GetString(adClipString, -1, ",", vbNullString);
对此:
Print #lngFile, rst.GetString(2, -1, ",", vbNullStrings); '2=adClipString
其中 ADODB 常量adClipString
被其长值2
替换,并且注释被附加到该行。
我得到的最接近的是以下内容:
perl -pi -e 's/adClipString(.+\n)/2$1\x272=adClipString\n/' -- somefile.bas
...但我不知道如何在不覆盖文件中每一行的情况下从捕获组中排除\n
。 如所写,注释被放在一个新行上(这不是我想要的)。 我确信答案就在我面前。
我是 perl 的新手,只在命令行上运行它。 我确信有更好的[阅读:工作]方法来解决这个问题。
.
不匹配换行符,并且perl -p
一次处理一行,因此要替换的字符串永远不会包含超过一行,并且您根本不需要匹配换行符。
perl -pi -e 's/\badClipString\b(.*)/2$1\x272=adClipString/' -- somefile.bas
我将.+
更改为.*
因为您没有给出任何指示adClipString
不应在行尾匹配。 我还用\b
包围了要替换的单词,这样像thisIsABadClipStringOtherVariable
这样的东西就不会被替换。
增加的复杂性是您有一个带有 Windows 行结尾的文件:CR+LF。 .
不匹配 LF(换行符,Unix/POSIX/basically-everyone-but-Windows-nowadays 换行符),但它匹配 CR(回车)。 所以这个替换将 CR 放在了行的中间(就在注释开始之前),这可能会混淆 Windows 程序。 解决此问题的一种方法是将 CR 从“其余行”组中排除。
perl -pi -e 's/\badClipString\b([^\r\n]*)/2$1\x272=adClipString/' -- somefile.bas
进行此转换的另一种方法是将字符串替换和添加注释视为单独的操作。 一个s
命令只有在进行替换时才被认为是真的。
perl -pi -e 's/\badClipString\b/2/ and s/\r?$/\x272=adClipString$&/' -- somefile.bas
或者,以一种不那么单行但更易读的方式:
perl -pi -e 'if (s/\badClipString\b/2/) { s/\r?$/\x272=adClipString$&/ }' -- somefile.bas
正则表达式\r?$
匹配行尾,带有可选的 CR。 替换将附加文本放在行尾,并在末尾添加$&
(代表与正则表达式匹配的整个字符串)以保留可选的 CR。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.