Сценарий sed, заменяющий строку "\ n" в строке символом новой строки - PullRequest
1 голос
/ 10 апреля 2020

Я недавно написал скрипт, который будет анализировать целую кучу файлов и увеличивать номер версии. Скрипт отлично работает для всех файлов, кроме одного. Для поиска строки в файле .tex и увеличения номера версии используется следующая команда sed (которая была собрана из различных поисков Google и очень ограниченных знаний sed).

sed -i -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' fileName.tex

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

\newcommand{\VERSION}{0.123},

, а команда sed заменяет "\ n "в строке выше с символом новой строки и, следовательно, с выводом

ewcommand{\VERSION}{0.124} (с новой строкой перед ним).

Желаемый результат будет:

\newcommand{\VERSION}{0.124}

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Используйте awk, это не смущает данные со специальными символами. Ваша проблема может быть решена путем временной замены обратных слешей, но я надеюсь, что этот ответ приведет вас к awk.

Для одной строки:

echo '\newcommand{\VERSION}{0.123},' | tr '\' '\r' | 
   sed -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' | tr '\r' '\'

Для файла

tr '\' '\r' < fileName.tex | 
   sed -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' |
   tr '\r' '\' > fileName.tex.tmp && mv fileName.tex.tmp fileName.tex

Когда \n является единственной проблемой, вы можете попробовать

sed -i -r 's/\\n/\r/g;s/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge;s/\r/\\n/' fileName.tex
0 голосов
/ 10 апреля 2020

Хорошо, поэтому я не смог получить ответ от Cyrus, потому что файл нашел около 50 других строк в моих текстовых файлах, которые он хотел изменить, и я не был совершенно уверен, как исправить оператор awk, чтобы найти просто конкретная c строка, которую я хотел. Тем не менее, я начал работать с оригинальным методом sed, внеся простое изменение.

Моя команда sed стала двумя, где первая создает временную строку %TMPSTR%, за которой сразу следует замена указанной временной строки, чтобы получить желаемый вывод и избегать появления символов новой строки.

sed -i -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\\%TMPSTR%{\\\2$((\3+1))\4"/ge' fileName.tex
sed -i -r 's/%TMPSTR%/newcommand/g' fileName.tex

Таким образом, строка в файле начинается с

\newcommand{\VERSION}{0.123} -> \%TMPSTR%{\VERSION}{0.124} -> \newcommand{\VERSION}{0.124}

и заканчивается желаемым результатом. Я полагаю, это немного некрасиво, но делает то, что мне нужно!

...