Регулярное выражение: заменить кавычки, кроме фигурных скобок - PullRequest
1 голос
/ 20 июня 2020

Вот пример текста уценки:

# "Мой заголовок"

! Подпись к изображению. {Style = "float: right; width: 20%; border: 1px "}

Некоторый" цитируемый текст ", некоторый *" выделенный текст "*, ​​и т. Д. c.

В сценарии bash я пытаюсь заменить любые двойные кавычки с французскими кавычками.

Например: «слово» должно стать «словом».

Другими словами, все кавычки перед словом должны быть заменены открытой французской кавычкой, за которой следует неразрывным пробелом; и все кавычки после слова следует заменить неразрывным пробелом, за которым следует закрытая французская кавычка; ЗА ИСКЛЮЧЕНИЕМ случаев, когда кавычки находятся внутри фигурных скобок.

Таким образом, предыдущий текст уценки должен быть преобразован следующим образом:

# «My title»

! Image caption . {style = "float: right; width: 20%; border: 1px"}

Некоторые «цитируемый текст», некоторые * «выделенный текст» * и т. д. c.

То, что я пробовал

Сейчас я использую в своем скрипте следующее регулярное выражение:

" Replace "word by « word
sed -i -Ee "/(^|\s|\(|\[)\"/ s//\1« /g" myfile.md
" Replace word" by word »
sed -i -Ee "/(\S)\"/ s//\1 »/g" myfile.md

Конечно, проблема в том, что оно заменяет все кавычки, даже внутри фигурных скобки.

Итак, мой вопрос: какое регулярное выражение могло бы заменить двойные кавычки французскими кавычками, кроме как внутри фигурных скобок?

1 Ответ

3 голосов
/ 20 июня 2020

С awk:

awk -F "" '
{
  for (i=1;i<=NF;i++){                    # loop over all fields/characters in line
    if ($i=="{") brace++                  # increment counter if `{` found
    if ($i=="}") brace--                  # decrement counter if `}` found
    if (brace==0 && $i=="\""){            # if counter is zero and char is a quote
      printf "%s", (cquote ? " »" : "« ") # print closing or opening french quote
      cquote=!cquote                      # toggle flag
      continue                            # continue with next character
    }
    printf "%s", $i                       # print character
  }
  print ""                                # print newline
}' file

Вывод:

# « My title »

!Image caption.{ style="float:right; width: 20%; border: 1px"}

Some « quoted text », some *« emphasized text »*, etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...