используйте sed для удаления содержимого между двумя символами, но до этого момента, а не до конца, если этот символ появится снова - PullRequest
0 голосов
/ 18 января 2020

Пример I: Я хочу оставить 'W' файл: input.txt содержание:

ab
ab ab z
ab z ab W ab z ab

Команда:

sed 's/ab.*ab/~/g' input.txt

Результат:

ab
~ z
~

Цель:

ab
~ z
~ W ~

Пример II: Цель: сохранить капля Файл: input.txt Содержание:

<\ab>
<\!DOCTYPE html> blob <>
<\!DOCTYPE html> blob <> blob2  <

Команда:

sed 's/<.*>/~/g' input.txt

Результат:

~
~
~ blob2  <

Цель:

~
~ blob ~
~ blob ~ blob2 <

К сожалению, выжил только blob2. Помогите мне сохранить blob one?

Похоже, sed найдет первый экземпляр '<' и последний экземпляр '>' и удалит то, что находится между ними. Я пытаюсь получить sed для замены между следующим экземпляром '>', а не последним.

1 Ответ

1 голос
/ 18 января 2020

Это может сработать для вас (GNU sed):

Сначала рассмотрим пример II:

sed 's/<[^>]*>/~/g' file

При совпадении по нулю или более не > до > мы предотвратить жадное .* от проглатывания всей линии, а затем сопоставление с образцом, работающее вдоль линии.

Пример I:

sed '/ab.*ab/!b;s/ab/\n/g;s/\n[^\n]*\n/~/g;s/\n/ab/' file

Если строка не содержит двух или более ab забудь об этом. В противном случае замените все ab уникальным символом, таким как \n, и, используя тот же прием, что и в примере II, замените \n[^\n]*\n на ~. Однако может быть нечетное число ab, поэтому замените такое вхождение его первоначальным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...