簡體   English   中英

如何將 append 文本發送到包含 Perl 中的替換的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM