#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