Text-Processing
如何在整個文件的每一行中替換特定上下文中的字元?
我有一個大文件,其中包含以下形式的數百個英語片語:
\phrase {. . . * * } {I shoul-d've stayed home.} {aɪ ʃʊd‿əv ˈsteɪd ˈhoʊm.} <- only replace on this line \phrase { . . * } {Did you eat?} {dɪdʒjʊʷˈit? ↗} <- only replace on this line \phrase { * . * . * . . . * . } {Yeah, I made some pas-ta if you're hun-gry.} {ˈjɛə, aɪ ˈmeɪd səm ˈpɑ stəʷɪf jər ˈhʌŋ gri.} <- only replace on this line
這是一個 LaTeX
.tex
文件。我想用符號(十六進制程式碼)替換r
每個音標中的所有字元(通過音標,我的意思是每行後的第三行)。\phrase``ɹ``U+0279
在 Emacs 中手動操作對我來說很麻煩。我想知道是否有辦法以某種方式定位這些行並自動進行替換。
所有
r
字元都必須替換為ɹ
,也不例外,但僅在拼音r
中,在英文/非拼音文本中保持原樣。是否可以通過使用腳本或其他方式以某種方式做到這一點?我的文件中沒有換行符,因此轉錄始終是
\phrase
. 謝謝!
一個 awk 版本(你需要一個中繼文件,你可以單行)
awk '/\\phrase/ { p=NR ; } NR == p+3 { gsub("r","ɹ") ; } {print;} ' old-file.tex > new-file.tex
在哪裡
/\\phrase/ { p=NR ; }
將設置為出現p
的每個行號\phrase
NR == p+3 { gsub("r","ɹ") ; }
之後在第 3 行執行替換{print;}
列印所有行。這給了你的樣本:(注意
ɹeplace
)\phrase {. . . * * } {I shoul-d've stayed home.} {aɪ ʃʊd‿əv ˈsteɪd ˈhoʊm.} <- only ɹeplace on this line \phrase { . . * } {Did you eat?} {dɪdʒjʊʷˈit? ↗} <- only ɹeplace on this line \phrase { * . * . * . . . * . } {Yeah, I made some pas-ta if you're hun-gry.} {ˈjɛə, aɪ ˈmeɪd səm ˈpɑ stəʷɪf jəɹ ˈhʌŋ gɹi.} <- only ɹeplace on this line
awk 'c&&!--c {gsub(/r/,"ɹ")} /\\phrase/ {c=3} 1' file > newfile
c&&!--c
是一個常見的awk
成語,實現while
getline
邏輯,見參考。只有在從 1 減到 0 時,才會執行此條件之後的操作。
匹配文字
'\phrase'
時,我們設置c=3
了 ,因此gsub()
將僅在匹配後的第 3 行執行,並且對所有匹配都重複。