Text-Processing

解析包含大括號轉義的大括號對

  • January 7, 2017

我有一些文本,其中某些部分標有_{...}; 我需要用星號替換封閉的下劃線和大括號對。因此,例如,Hello _{world} _{foo}將變為Hello *world* *foo*.

這是一個簡單的問題,sed -r 's/_\{([^}]+)}/*\1*/g'如果不是因為它們可以包含大括號轉義,可以很容易地解決。因此,例如,文本:

Hello _{world \} \}} _{foo bar}

會導致:

Hello *world } }* *foo bar*

我該怎麼做呢?

如果反斜杠表示“轉義下一個字元”(無論是大括號、另一個反斜杠還是除行尾之外的任何內容),那麼您可以像這樣“跳過”下一個字元:

sed -r 's/_\{((\\.|[^}\\])+)\}/*\1*/g

如果反斜杠在大括號之前只有特殊含義,那麼您需要在每次執行 1 個或多個反斜杠之後“跳過”第一個非反斜杠字元:

sed -r 's/_\{((\\+[^\]|[^}\\])+)\}/*\1*/g'

當你想匹配前面沒有的東西時,你需要一個消極的後視。sed不支持前瞻和後瞻,但 Perl 支持。

echo 'Hello _{world \} \}} _{foo bar}' | perl -npe 's/_\{(.+?)(?<!\\)}/*\1*/g'

這將輸出:

Hello *world \} \}* *foo bar*

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