Ваше регулярное выражение
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 ведет себя так, как он.