Как добавить символ в конец строки, когда поиск и замена сделаны в начале? - PullRequest
0 голосов
/ 03 сентября 2018

Я создаю простой скрипт, который преобразует пользовательскую разметку в макросы TeX:

? What are four kinds of animals?
- elephants
- tigers
- bears
- fish
e

Это становится:

\QUESTION{What are four kinds of animals?}{
\ANSWER{elephants}
\ANSWER{tigers}
\ANSWER{bears}
\ANSWER{fish}
}

Я использовал простой синтаксис для замены элементов спереди:

sed 's#^? #\\QUESTION{#' file > temp1
sed 's#^\- #\\ANSWER{#' temp1 > temp2
sed 's#^e #\}{#' temp2 > temp3

Как мне получить также добавление }{ в конец, когда "?" находится в начале, и добавьте } в конец, когда "-" будет найдено в начале строки?

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Как это:

sed -E 's/^(\? )(.*)/\\QUESTION{\2}{/;t;s/- (.*)/\ANSWER{\1}/;t;s/e/}/' file

Пояснение:

  • s/^(\? )(.*)/\\QUESTION{\2}{/ Обрабатывать строки, начинающиеся с ?
  • t означает не дальнейшие действия, если указанная выше команда s заменила что-то
  • s/- (.*)/\ANSWER{\1}/ Обрабатывать строки, начинающиеся с -
  • t означает не дальнейшие действия, если указанная выше команда s заменила что-то
  • s/^e/}/ Обрабатывать строки, начинающиеся с e.

Вы можете немного «ускорить его», переупорядочив команды по сложности шаблона поиска, например:

sed -E 's/e/}/;t;s/- (.*)/\ANSWER{\1}/;t;s/^(\? )(.*)/\\QUESTION{\2}{/;' file

Но да, возможно, микрооптимизация.

0 голосов
/ 03 сентября 2018

Вы можете попробовать этот sed тоже:

sed '/^- /s//\\ANSWER{/;/^e/s///;s/$/}/;/^? /{s//\\QUESTION{/;s/$/{/}' infile


sed '
  /^- /s//\\ANSWER{/  # line with -
  /^e/s///            # line with e
  s/$/}/              # add } at the end of each line  
  /^? / {             # line with ?
    s//\\QUESTION{/
    s/$/{/
  }
' infile
0 голосов
/ 03 сентября 2018

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

sed -e 's#^? \(.*\)#\\QUESTION{\1}{' -e 's#^- \(.*\)#\\ANSWER{\1}#' -e 's#^e#}#'

В этой команде \(...\) являются группами захвата, а \1 относится к их содержимому.

Я также позволил себе перегруппировать ваши множественные s учреждения в одну команду sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...