Ваше регулярное выражение
sed 's#&*;##g' <file>
не делает то, что вы думаете, что делает. Символ *
- это множитель, который говорит, что предыдущий символ повторяется 0 или более раз. Предыдущий символ - &
, поэтому он будет соответствовать, например, &&&;
и ;
&
Написано 0 раз перед тем ;
Это то, что соответствует в ваших тестовых случаях), но не то, что вы хотите в этом случае.
Вы должны указать «любой символ» до множителя, который представлен одной .
,
$ echo 'Text:3' | sed 's#&.*;##g'
Text3
Это была первая проблема. Второй - концепция так называемого "жадного" сопоставления: sed
увидит первое &
а затем попытается сопоставить наибольшую возможную строку. Если у вас есть несколько объектов HTML в одной строке, это будет проблемой, так как:
$ echo 'Text:3 and some more text å and end' | sed 's#&.*;##g'
Text and end
Если вы хотите увидеть исправление в контексте sed
, вы можете найти конечный символ сущности, сопоставив любое число « not ;
» перед закрытием ;
при выполнении:
$ echo 'Text:3 and some more text å and end' | sed 's#&[^;]*;##g'
Text3 and some more text and end
У вас все еще будут проблемы с законным использованием знака амперсанда (&
) в тексте (ну, &
это реальное "законное" использование, но реальный мир не всегда такой же разборчивый, как идеальный) и слишком большое совпадение, но это объясняет, почему sed
ведет себя так, как он.