У вас есть разные способы выполнения работы, я бы порекомендовал использовать sed
, так как вы хотите заменить какой-то шаблон в файле.
ВХОД:
$ cat test1.rnw
\begin{question}
A business incurs the following costs per unit: Labor \$125/unit; Materials \$45/unit and rent \$250,000/month. If the firm produces 1,000,000 units a month, the total variable costs equal
\begin{answerlist}
\item \$125Million
\item \$45Million
\item \$1Million
\item \$170Million
\end{answerlist}
\end{question}
\begin{solution}
\begin{answerlist}
\item F.
\item F.
\item F.
\item F.
\end{answerlist}
\end{solution}
\exname{target}
\extype{schoice}
\exsolution{0001}
\exshuffle{TRUE}
Команда:
FILENAME=`basename test1.rnw .rnw`; sed 's/^\\exname{target}/\\exname{'"$FILENAME"'}/' test1.rnw
Пояснения:
basename
используется с именем файла и расширением, чтобы удалить его из имени файла, результат сохраняется в переменной с именем FILENAME
.
- Вы используете
find and replace
функцию sed
и заменяете ^\\exname{target}
(строки, начинающиеся с \exname{target}
на \exname{
, сопровождаемые содержимым переменной FILENAME
и заканчивающиеся }
ВЫВОД:
\begin{question}
A business incurs the following costs per unit: Labor \$125/unit; Materials \$45/unit and rent \$250,000/month. If the firm produces 1,000,000 units a month, the total variable costs equal
\begin{answerlist}
\item \$125Million
\item \$45Million
\item \$1Million
\item \$170Million
\end{answerlist}
\end{question}
\begin{solution}
\begin{answerlist}
\item F.
\item F.
\item F.
\item F.
\end{answerlist}
\end{solution}
\exname{test1}
\extype{schoice}
\exsolution{0001}
\exshuffle{TRUE}
TODO:
- перенаправить стандартный вывод в файл, чтобы сохранить результат
- или используйте
-i
или -i.bak
для внесения изменений на месте (СДЕЛАЙТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ ПЕРЕД)
DOC:
https://www.gnu.org/software/sed/manual/sed.html
Если вы любитель awk
, вы также можете использовать следующую команду для достижения того же результата:
awk '/^\\exname/{noext=FILENAME;sub(/\..*$/,"",noext);print "\\exname{"noext"}";next}1{print}' test1.rnw
Пояснения:
1{print}
напечатает каждую строку
/^\\exname/{noext=FILENAME;sub(/\..*$/,"",noext);print "\\exname{"noext"}";next}
для строк, начинающихся с \exname
, вы получаете доступ к FILENAME и удаляете расширение с помощью noext=FILENAME;sub(/\..*$/,"",noext)
, затем вы печатаете строку с помощью print "\\exname{"noext"}"
и переходите к строке next
, чтобы избежать двойной печати.