Text-Processing

如何在整個文件的每一行中替換特定上下文中的字元?

  • May 6, 2022

我有一個大文件,其中包含以下形式的數百個英語片語:

\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 行執行,並且對所有匹配都重複。

引用自:https://unix.stackexchange.com/questions/701267