Sed скрипт для перезаписи определенных строк - PullRequest
0 голосов
/ 05 июня 2018

Я имею дело с телом XML-файлов, содержащих неструктурированные тексты с семантической разметкой для личных имен.

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

<persName>Fred</persName>'s
<persName>Wilma</persName>'s

с

<persName>Fred's</persName>
<persName>Wilma's</persName>

У меня есть одна строка в скрипте оболочки, которая запускается в Gitbash для Windows, ниже.Он работает нормально, но не имеет никакого эффекта.Полагаю, я упускаю что-то очевидное, возможно, из-за побега персонажей, но любая помощь приветствуется.

sed -i "s/<\/persName>\'s/\'s<\/persName>/g"  test.xml

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете использовать

sed -i "s,</persName>'s,'s</persName>,g" test.xml

Подробности

  • s - мы хотим заменить
  • , - aразделитель
  • </persName>'s - эта строка для поиска
  • , - разделитель
  • 's</persName> - заменить на эту строку
  • , -delimiter
  • g - несколько раз, если найдено более одного

Опция -i производит замены непосредственно в файле.

Обратите внимание, что выне нужно экранировать ' при определении команды sed внутри строки в двойных кавычках.

Рекомендуется использовать символ-разделитель, отличный от обычного /, если внутри / есть символырегулярное выражение или / и шаблон замены.

0 голосов
/ 05 июня 2018

Комментарий к вашему вопросу предлагает более простое решение, но я думаю, что могут быть имена, в которых суффикс 's отличается, например, имена, заканчивающиеся на s.Поэтому я выбрал решение, в котором вы берете то, что правильно, и помещаете его посередине.

В качестве разделителя для команды поиска и замены в sed вы можете выбрать все, что захотите.Я выбрал #, поэтому вам не нужно избегать обратной косой черты в тексте.Спасенные парантезы хранят то, что внутри, в переменных \1 и \2.

sed 's#<persName>\(.*\)</persName>\(.*\)#<persName>\1\2</persName>#g' testfile

Результат:

<persName>Fred's</persName>
<persName>Wilma's</persName>

Если вы хотите заменить его в файле, вы можете использовать параметр -i.Но не забудьте сначала проверить результат.

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