регулярное выражение sed не учитывает двойные кавычки или пробелы - PullRequest
1 голос
/ 17 апреля 2020

После того, как команда sed с regex не работает должным образом, я хочу удалить элемент host, но он также удаляет следующий элемент

команда sed

sed -i 's+^\(.*SERVER.*\)\(host=.*\)[[:blank:]]\(.*/>.*\)$+\1\3+' /tmp/file_tmp.xml

/ tmp / file_tmp. xml

  <SERVER port="2001" buildg="group1" host="host1" slices="1" search="st0"/>
  <SERVER port="2003" buildg="group2" host="" slices="1" search="st1"/>

ожидаемый результат:

  <SERVER port="2001" buildg="group1" slices="1" search="st0"/>
  <SERVER port="2003" buildg="group2" slices="1" search="st1"/>

Фактический результат

  <SERVER port="2001" buildg="group1" search="st0"/>
  <SERVER port="2003" buildg="group2" search="st1"/>

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

.* является жадным (соответствует самой длинной из возможных строк), поэтому значение в host=.*[[:blank:]] ловит все до (не включительно) search. Попробуйте вместо этого:

sed 's+^\(.*SERVER.*\)\(host=[^ ]*\)[[:blank:]]\(.*/>.*\)$+\1\3+'
0 голосов
/ 17 апреля 2020

Вот простое решение sed.

  1. Найдите интересующую линию, используя шаблон grep ``

  2. Удалите необходимую строку RegExp в найденной строке.

    sed -i '/^[[:space:]]*<SERVER/s| host="[^"]*"||' input.txt
    

Пояснение

/^[[:space:]]*<SERVER/ Фильтровать только строку, начиная с пробелов и SERVER

s| host="[^"]*"|| Заменить RegExp host="[^"]*" с пустой строкой.

host="[^"]*" RegExp для соответствия name"*"

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