Заменяйте теги, окружающие строку, только если строка содержит совпадение

#regex #sed #replace

Вопрос:

У меня есть файл со многими строками, содержащими строки, окруженные тегами.

   <tag:identifier>99454</tag:identifier>
  <tag:identifier>97817(web)</tag:identifier>
  <tag:identifier>http://www.google.com</tag:identifier>
  <tag:title>Title String/</tag:title>
  <tag:creator>Example</tag:creator>
  <tag:creator>Field</tag:creator>
  <tag:creator>Country</tag:creator>
 

Я пытаюсь найти способ изменить теги вокруг каждого URL-адреса. Все они начинаются с <tag:identifier>http , так что найти, какие строки содержат URL-адреса, не проблема, я просто не знаю, как я тоже могу заменить конечный тег. Например, чтобы <tag:url>http://www.google.com</tag:url>

Какой инструмент я могу использовать для этого?

Ответ №1:

Вы можете попробовать это sed

 sed -E '/http/ {s/identifier/url/g}' $file
 

Это будет соответствовать любой строке, http а затем заменит identifier url

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

 awk -F"[<>]" '$3~/http/{$2="<tag:url>"; $4="</tag:url>"}1' $file
 

Здесь мы устанавливаем разделитель на < или > и заменяем значения столбцов 2 и 4

Выход

   <tag:identifier>99454</tag:identifier>
  <tag:identifier>97817(web)</tag:identifier>
  <tag:url>http://www.google.com</tag:url>
  <tag:title>Title String/</tag:title>
  <tag:creator>Example</tag:creator>
  <tag:creator>Field</tag:creator>
  <tag:creator>Country</tag:creator>
 

Комментарии:

1. Спасибо, я на macOS и использовал sed -E '/http/ s/:identifier/:idurl/g' file.xml > newfile.xml , и это сработало отлично, спасибо, что наставили меня на правильный путь 🙂

Ответ №2:

Когда у вас может быть URL-адрес, например http://www.identifier.com , вы можете сопоставить каждую часть строки.

 sed -r 's#<(tag:identifier)>(.*)</1>#<tag:url>2</tag:url>#' file