perl -pi -e "s/\x22message\x22\s \x22Боже, ты посмотри вокруг, что происходит!\x22/\x22message\x22 \x22\x22/g;" "D:\Sav\scripts\chat_wheel.txt"
除了我要洗掉的俄語文本部分外,此命令沒有任何問題
Боже, ты посмотри вокруг, что происходит!
當我在 cmd.exe 中運行它時,我收到以下錯誤訊息。
正則運算式中的嵌套量詞;標記為 <-- HERE in m/\x22message\x22\s \x22??? <-- 這里?,??????????????,?????????????!\x22/ 在 -e 第 1 行。
那么,如何在將命令保持為單行的同時替換俄語短語?有可能嗎?
我的控制臺使用 CP 65001 (UTF-8)。[發件人Win32::GetConsoleCP()]
我的活動代碼頁 (ACP) 是 1252 [發件人Win32::GetACP()]。
我的檔案使用 UTF-8 編碼。
uj5u.com熱心網友回復:
Б正在被替換?。這是因為控制臺的代碼頁、活動代碼頁或兩者都不支持它。
您的控制臺的代碼頁設定為 65001 或 UTF-8。因此,您的控制臺可以處理 Unicode 字符集中的任何字符。問題顯然不在這里。
每個處理字串的 Windows 系統呼叫都有兩種型別。使用 UTF-16le 的“W”ide 變體和使用 Active Code Page 的“A”NSI 變體。如果 Perl 使用“W”介面來獲取它的命令列引數,我們就不會遇到這個問題。Perl 對此(和所有其他)系統呼叫使用“A”介面。
這意味著 Perl 只能接受可以由活動代碼頁表示的命令列引數。在您的情況下,它是1252,并且 cp1252 字符集不包含任何西里爾字符。
假設我們不想用轉義符替換每個字符(就像你如何用 替換雙引號"),我們將需要做一些不同的事情。
由于我們無法使用引數傳遞腳本,因此我們需要使用檔案而不是使用-e. 或通過管道。
echo s/"message"\s "\KБоже(?=")// | perl -i -p - file.txt
一個更好但更徹底的解決方案是將Perl 的 ACP 更改為 65001。
還有第二個問題。
Perl 期望其源代碼使用(8 位干凈)ASCII 編碼,除非您提供use utf8;. 所以當你認為你正在通過s/...Боже...//時,你真的在??通過s/...\xD0\x91\xD0\xBE\xD0\xB6\xD0\xB5...//。
這很好,部分原因是您也沒有解碼輸入檔案。但它可能會帶來驚喜。例如,"Б" =~ /^[Бж]\z/( "\xD0\x91" =~ /^[\xD0\x91\xD0\xB6]\z/) 將回傳 false!
要在腳本中解決此問題,您可以使用
use utf8; # Source code is using UTF-8.
use open ':std', ':encoding(UTF-8)'; # Terminal provides & expects UTF-8.
-C會在這里做。
echo s/"message"\s "\KБоже(?=")// | perl -i -C -p - file.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464650.html
標籤:perl
