あなたの正規表現
sed 's#&*;##g' <file>
あなたがそれがすると思うことをしません。の *
characterは、前の文字が0回以上繰り返されることを示す乗数です。前の文字は &
だから、これは例えばと一致します &&&;
そして ;
( &
0回前に書かれる ;
!これはあなたのテストケースでマッチしているものですが)あなたがこのケースで欲しいものではありません。
"を指定する必要があります どれか 乗数の前の文字 "。これは単一のドットで表されます。 .
。
$ echo 'Text:3' | sed 's#&.*;##g'
Text3
それが最初の問題でした。二つ目は、いわゆる "欲張り"マッチングの概念です。 sed
最初を見ます &
次に、それができる最大の文字列と一致するようにします。 1行に複数のHTMLエンティティがある場合、これは問題になります。
$ echo 'Text:3 and some more text å and end' | sed 's#&.*;##g'
Text and end
あなたがで修正を見たい場合は sed
コンテキストでは、任意の数の "と一致させることでエンティティの終了文字を探すことができます。 ではない ;
「閉幕前 ;
することによって:
$ echo 'Text:3 and some more text å and end' | sed 's#&[^;]*;##g'
Text3 and some more text and end
アンパサンド記号の正当な使用法には問題があります( &
本文中) &
本当の「合法的」な使い方ですが、現実の世界は必ずしも理想的なものほどパース可能ではありません) sed
それはそれがしているやり方で振舞っている