На самом деле это не имеет ничего общего с приоритетом (, который обычно относится к операторам ), а с порядком, в котором выдаются команды.
Взгляните на первый пример в вопросе:
N
s/System\nAdministrator/Desktop\nUser/
s/System Administrator/Desktop User/
Это будет читать строки попарно и применять к ним две замены. Если вторая строка в паре заканчивается наSystem
(с Administrator
на следующей, третьей, строке ), то он не сможет это обнаружить. Это означает, что строка, расположенная между нечетной и четной строками, не будет заменена .
Взглянем на второй пример в вопросе (с исправленной орфографией):
s/System Administrator/Desktop User/
N
s/System\nAdministrator/Desktop\nUser/
Это изменит строку в текущей строке, прочитает следующую строку и изменит строку с новой строкой в середине. Это не изменит нечетные строки с полной копией строки(или нечетные строки только с System
).
Использование GNUsed
:
:top
N
$s/System\(.\)Administrator/Desktop\1User/g
b top
Этот скрипт зацикливается и считывает все строки файла в пространство шаблонов. Как только он достигает последней строки ввода, он выполняет глобальную замену, допуская, что любой символ между двумя словами (также может использовать\([ \n]\)
)вместо\(.\)
).
Результатом будет
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: Desktop User's Group as well.
1.Desktop User's group.
2.Desktop Users Group.
3.Desktop Users Group.
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Desktop Users Group.
Хотя я настоятельно рекомендую использовать специальный парсер, такой как xmlstarlet
, для структурированного текста, следующая команда sed
будет работать при условии, что в вашем файле есть только один такой тег base
:
sed -E '/\<base/s,(href="/)[^"]+,\1,' input.html
Это будет воздействовать на строки, содержащие шаблон <base
, и заменять шаблон href="/any text up to the double quote
на href="/
, тем самым удаляя текст за /
.
Обратите внимание, что по умолчанию файл не редактируется. Чтобы отредактировать файл, либо перенаправьте вывод в файл,или используйте опцию редактирования места -i
:
sed -i -E '/\<base/s,(href="/)[^"]+,\1,' input.html
Предполагая, что документ является правильно отформатированным XML-документом:
<?xml version="1.0"?>
<root>
<base href="/monitoring/"/>
</root>
Следующее использует xmlstarlet
для удаления строкиmonitoring/
(и всего, что после нее )из атрибута href
любого base
узла, содержащего эту строку:
xmlstarlet ed \
-u '//base/@href[contains(.,"monitoring/")]' \
-x 'substring-before(.,"monitoring/")' file.xml
При этом выводится XML-документ, который следует перенаправить на новое имя, а затем заменить исходный файл.