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

На самом деле это не имеет ничего общего с приоритетом (, который обычно относится к операторам ), а с порядком, в котором выдаются команды.


Взгляните на первый пример в вопросе:

N
s/System\nAdministrator/Desktop\nUser/
s/System Administrator/Desktop User/

Это будет читать строки попарно и применять к ним две замены. Если вторая строка в паре заканчивается наSystemAdministratorна следующей, третьей, строке ), то он не сможет это обнаружить. Это означает, что строка, расположенная между нечетной и четной строками, не будет заменена .

Взглянем на второй пример в вопросе (с исправленной орфографией):

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.
-1
18.12.2020, 14:57
2 ответа

Хотя я настоятельно рекомендую использовать специальный парсер, такой как 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 
0
18.03.2021, 22:42

Предполагая, что документ является правильно отформатированным 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-документ, который следует перенаправить на новое имя, а затем заменить исходный файл.

1
18.03.2021, 22:42

Теги

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