![在 vim 替換和 perl 餅替換之間轉換](https://rvso.com/image/1316127/%E5%9C%A8%20vim%20%E6%9B%BF%E6%8F%9B%E5%92%8C%20perl%20%E9%A4%85%E6%9B%BF%E6%8F%9B%E4%B9%8B%E9%96%93%E8%BD%89%E6%8F%9B.png)
所以我有一個文件 test.txt,其中包含,
home -> range
如果我在 vim 中編輯檔案並執行命令,%s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
它將檔案轉換為
range ::= home ;
這就是我想要的。但是如果我跑
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
我認為應該做同樣的事情,我沒有得到任何改變 - 有人可以告訴我出了什麼問題嗎?我懷疑有些東西需要轉義,但我已經對它拋出了各種轉義組合...另外我想要一些關於兩種格式之間轉換的一般規則...
答案1
在 Perl 中,您不會轉義捕獲括號,而且通常使用 $1,$2 而不是 \1,\2 來捕獲變數。
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
這是生活中一個不幸的事實正規表示式(RE) 許多常用工具(vim、sed、awk、perl)中使用的都略有不同。某些工具可以選擇使用 Perl RE、POSIX Basic RE (BRE) 或 POSIX Extended RE (ERE)。
perldoc perlre
在替換表達式的替換部分中$1
vs有這樣的說法\1
有些人太習慣寫這樣的東西:
$pattern =~ s/(\W)/\\\1/g;
這是替代品的 RHS 的祖父,以避免震驚 sed 成癮者,但這是一個骯髒的習慣。這是因為在 PerlThink 中,「s///」的右側是雙引號字串。通常的雙引號字串中的“\1”表示控制-A。 「\1」的 Unix 習慣意義被拼湊成「s///」。但是,如果您養成了這樣做的習慣,然後添加“/e”修飾符,就會給自己帶來麻煩。