Как вставить текст между двумя заданными шаблонами с помощью sed?

Один из способов сделать это (при условии отсутствия новых строк в именах файлов) -

ls -t ... | head -n5 | tail -n1
1
08.04.2018, 21:55
2 ответа

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

sed -i 's/<a href=".*">/<a href="/some/link/">/g' yourfile.html

Здесь простой синтаксис:

sed -i 's/stringt before replacing/string after replacing/g'

.*— это подстановочный знак, который соответствует любому использованию в нужном месте

Возможно, вам следует скопировать файл перед использованием sed. -iизменяет ваш файл, а не создает новый:

-i [SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)

gв конце заменяет все совпадения в файле

если вы хотите изменить только первое совпадение в вашем файле, используйте:

sed -i '0,/<a href=".*">/{s/<a href=".*">/<a href="/some/link/">/}' yourfile.html

тот же синтаксис:

sed -i '0,/string before/{s/string brefore/string after/}'
0
27.01.2020, 23:43

Решение sedсм. ниже в этом ответе.

Предположим, что узлы aявляются частью правильно сформированного XML-документа и что вы хотите добавить .xhtmlк значению их тегов href, когда существующие значения начинаются с /entry/:

.
xml ed -u '//a[starts-with(@href, "/entry/")]/@href' \
       -x 'concat(../@href,".xhtml")' file.xml >file-new.xml

При этом используется XMLStarlet (, который иногда устанавливается как xmlstarletвместо просто xml), и он находит соответствующие узлы aи добавляет .xhtmlк их атрибутам hrefнезависимо от того, где в документе они происходят.

Здесь результат сохраняется в новый файл, но вы можете использовать xml ed --inplace...для редактирования файла на месте, как только убедитесь, что он работает.

Тестирование:

$ cat file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1"/>
  <a href="/entry/someFile2"/>
  <a href="/entry/someFile3"/>
</root>

$ xml ed -u '//a[starts-with(@href, "/entry/")]/@href' -x 'concat(../@href,".xhtml")' file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1.xhtml"/>
  <a href="/entry/someFile2.xhtml"/>
  <a href="/entry/someFile3.xhtml"/>
</root>

Использование sed(, которое вы бы не использовали в правильно сформированном файле XML,):

sed 's|<a href="/entry/[^"]*|&.xhtml|g' file.xml

Это соответствует строке <a href="/entry/, за которой следует любое количество символов, кроме "(, это будет имя файла ). Затем вся эта совпадающая часть заменяется самой собой и строкой .xhtml.

С помощью sed -iэто сделает модификацию на месте.

Тестирование (на том же файле, что и выше):

$ sed 's|<a href="/entry/[^"]*|&.xthml|g' file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1.xhtml"/>
  <a href="/entry/someFile2.xhtml"/>
  <a href="/entry/someFile3.xhtml"/>
</root>
2
27.01.2020, 23:43

Теги

Похожие вопросы