Замена шаблона внутри параметра html - PullRequest
0 голосов
/ 24 января 2019

Я хочу заменить это

href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" 

с

href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf" 

-Это просто псевдокод для огромного файла, с которым я работаю, поэтому я не могу сделать это вручную.
-И все в одной строке, поэтому я считаю, что все, что я могу использовать, это команда замены
-Это даже возможно с помощью sed?

Я пробовал

sed '/href/s#//noname.com.*(armada|family)?#//noname.com/arid#g' < list.html > list2.html

но ничто не заменяется ....?

Я использую GNU sed версии 4.7

1 Ответ

0 голосов
/ 24 января 2019

Для GNU sed:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/(basil/armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

В этом случае вы можете использовать -E или -r.(-E более совместимо в разных системах)
Также вы забыли basil/ ...
Проверьте sed --help или man sed для получения дополнительной информации.

Обновите , какПримерно так:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href="..noname.com/s#(armada|family)#arid#g'
href="//noname.com/basil/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

Вы можете изменить .. на \/\/ для точности.

Если вы не хотите сохранять basil часть ...
Ваша команда в комментарии оставляет только один URL из-за регулярного выражения жадного режим, проверьте это:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#href....noname.com/(.*)(armada|family).*#\1#g'
basil/armada/joke.pdf" href="//noname.com/

Вы можете видеть, что .* фактически захватили сначала basil до следующего family.
Итак, нам нужно найтиспособ не допустить, чтобы регулярное выражение было слишком жадным, например:

$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/[^.]*(armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"

* * * * * * * * * [^.] означает любой символ, который не является ., в этом случае, чтобы избежать совпадения регулярного выражения с .до pdf, как знак остановки.
В других случаях вам может понадобиться найти другой якорь.
Проверьте больше здесь .

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