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

Мне не удается объединить различные советы и ответы на частично похожие вопросы, на которые уже давались ответы на форуме, поэтому я задам свой вопрос, надеясь, что кто-то поделится идеями, чтобы решить эту проблему: -)

Итак, вот проект:

  • У меня много .tex файлов
  • Я реструктурирую их в более совершенную (систематизированную) систему управления, используя некие метаданные
  • Предполагается, что все они имеют помеченные линии, которые я хотел бы изменить.

Входные файлы выглядят так:

\section{the title}
\status{Work in progress}

content

Названия, очевидно, все разные, и статус варьируется от «Делать» до «Работа в процессе» и «Написано».

Необходимый вывод:

\renewcommand{\TITLE}{the title}
\renewcommand{\STATUS}{\Doing}

\section{\TIT}

\STA

content

Sythesis

  • Заголовок должен оставаться прежним (поэтому я полагаю, мне понадобится переменная)
  • Статус должен быть стандартизирован
  • Часть предтвержденного текста систематизирована

Есть идеи? : -)

1 Ответ

0 голосов
/ 30 апреля 2018

Как рекомендует @Beta, вам, вероятно, следует разбить вашу проблему на несколько подзадач, которые вы можете решить самостоятельно. Давайте начнем с поиска способа преобразования разделов, затем статусов, затем комбинирования обоих и, наконец, но не в последнюю очередь, объединения всего этого для запуска нескольких файлов.

Преобразование заголовка (один файл)

Мы можем использовать sed для обнаружения разделов и преобразования их в две строки: renewcommand и new section.

sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g'

Работает так:

echo '\section{The title}' | sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' 

Результатом будет:

\renewcommand{\TITLE}{The title}
\section{\TIT}

Статус преобразования (один файл)

Мы можем применить очень похожую трансформацию для статуса:

sed -r 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g'

Что изменится:

\status{Work in progress}

в:

\renewcommand{\STATUS}{Work in progress}
\STA

Объедините оба (один файл)

Теперь вы можете легко применять один седь за другим к данному файлу:

sed -ir \
  -e 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g' \
  -e 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' filename.tex

Это применит оба преобразования к filename.tex и изменит их на месте.

Применить к нескольким файлам

Теперь вы можете применить эту команду sed ко всем файлам в вашей папке (рекурсивно), используя find и xargs, чтобы вызвать команду для каждого файла:

find . -name '*.tex' -print0 | xargs -0 -I{} sed -ri  \
  -e 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g' \
  -e 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' {}

find . -name '*.tex' -print0 будет рекурсивно перечислять все tex файлы. Затем | xargs -0 -I{} command {} вызовет command для каждого отдельного файла.

Я бы позаботился о том, чтобы вы сделали резервную копию (или контроль версий) всех ваших файлов перед попыткой таких преобразований. Просто чтобы убедиться, что вы можете откатиться, если что-то пойдет не так.

Надеюсь, это поможет.

...