2017年6月19日 星期一

使用 perl one liner 進行檔案搜尋取代的流程(SOP)(二)

承接 使用perl one liner進行檔案搜尋取代的流程(SOP) 一文的第 2 步驟,由於使用 one-liner 時如果要進行取代,沒有什麼空間去做額外的判斷,因此在取代字串很可能必需向前參考所找到的 subgroup 。全寫在一行易讀性的確滿不好,但是這是 perl 的簡潔所必需付出的代價。

原理參考:
http://www.perlmonks.org/?node_id=687031
http://perldoc.perl.org/perlretut.html#Non-capturing-groupings

例如想把文字:

**** 67                                                            

取代成

**** 67                                                            :drill:

在 windows 平台上的寫法是像這樣的:

perl -ne "print if s/^(\*+ \d+[ \t]+)?$/eval q{\"$1:drill:\"}/e and defined $1" abc.txt

或是更簡潔一點:

perl -ne "print if s/^(\*+ \d+[ \t]+)?$/q{\"$1:drill:\"}/ee and defined $1" abc.txt

一樣的道理可推到第 3、4 步,但不用去 test 有沒有發生取代:

perl -pe "s/^(\*+ \d+[ \t]+)?$/q{\"$1:drill:\"}/ee" abc.txt

perl -pi -e "s/^(\*+ \d+[ \t]+)?$/q{\"$1:drill:\"}/ee" abc.txt


沒有留言:

張貼留言