試圖在 zsh 中使用 Perl one liner 來匹配漢字,我真的很難過。我無法讓 \p{script=Han} 匹配漢字,但 \P{script=Han} 可以。
任務: 我需要改變這個:
一
<lb/> 二
對此:
<tag ref="一二">一
<lb/> 二</tag>
兩個漢字之間可能有可變數量的標簽、換行符、空格、制表符、字母數字字符、數字等。我相信最有效和最有效的方法是尋找*不是漢字的東西。
我嘗試的解決方案:
perl -0777 -pi -e 's/(一)(\P{script=Han}*?)(二)/<tag ref="$1$3">$2<\/tag>/g'
當應用于上面的示例時,這具有預期的效果。
問題: 我遇到的問題是 \P{script=Han}(或 \p{^script=Han})也匹配漢字。
當我嘗試匹配 \p{script=Han} 時,盡管它是一個充滿漢字的檔案,但正則運算式不匹配任何內容。當嘗試匹配 \P{script=Han} 時,正則運算式匹配檔案中的每個字符。
我不知道為什么。
這是一個問題,因為在這種情況下,輸出不如預期:
一
<lb/> 三二
變成
<tag ref="一二">一
<lb/> 三二</tag>
我不希望這完全匹配 - 只是一和二僅由非漢字字符分隔的情況。
誰能告訴我我做錯了什么?或者建議一個解決方法?謝謝!
uj5u.com熱心網友回復:
當我嘗試匹配 \p{script=Han} 時,盡管它是一個充滿漢字的檔案,但正則運算式不匹配任何內容。
問題是您的腳本和輸入檔案都是 UTF-8 編碼的,但您沒有對 perl 這么說。如果你不告訴 perl,它將假定它們是 ASCII 編碼的。
要說您的腳本是 UTF-8 編碼的,請使用utf8 pragma。要告訴 perl 您打開的所有檔案都是 UTF-8 編碼的,請使用-CD命令列選項。因此,以下 oneliner 應該可以解決您的問題:
perl -Mutf8 -CD -0777 -pi -e 's/(一)(\P{script=Han}*?)(二)/<tag ref="$1$3">$2<\/tag>/g' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533314.html
標籤:perlzshcjk单线
