Text-Processing
解析包含大括號轉義的大括號對
我有一些文本,其中某些部分標有
_{...}
; 我需要用星號替換封閉的下劃線和大括號對。因此,例如,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*