sed regex特殊文字を削除します


0

私はHTML形式のテキストに由来するいくつかの文字列を含むファイルを持っているので、それらはコンソールインターフェースでは良く見えないいくつかのHTMLシーケンスを持っています。これが例です:

Text1™
[Text®2]
Text:3

私が試みているのは、& Aの間のすべてを削除することです。そして。そのため、テキストは次のように再び読みやすくなります。

Text1
Text2
Text3

私は実際に余分な文字を削除するためにsedを使用しようとしています:

sed 's#&*;##g' <file>

問題はそれが削除されるだけであるということです。テキスト文字列から。

問題は、余分なチェーンを削除するために正規表現をどのようにコーディングするべきかということです。 &amp;#[1-9] +;

回答:


1

あなたの正規表現

sed 's#&*;##g' <file>

あなたがそれがすると思うことをしません。の * characterは、前の文字が0回以上繰り返されることを示す乗数です。前の文字は &だから、これは例えばと一致します &&&; そして ;& 0回前に書かれる ;!これはあなたのテストケースでマッチしているものですが)あなたがこのケースで欲しいものではありません。

"を指定する必要があります どれか 乗数の前の文字 "。これは単一のドットで表されます。 .

$ echo 'Text&#58;3' | sed 's#&.*;##g'
Text3

それが最初の問題でした。二つ目は、いわゆる "欲張り"マッチングの概念です。 sed 最初を見ます & 次に、それができる最大の文字列と一致するようにします。 1行に複数のHTMLエンティティがある場合、これは問題になります。

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&.*;##g'
Text and end

あなたがで修正を見たい場合は sed コンテキストでは、任意の数の "と一致させることでエンティティの終了文字を探すことができます。 ではない ; 「閉幕前 ; することによって:

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&[^;]*;##g'
Text3 and some more text  and end

アンパサンド記号の正当な使用法には問題があります( & 本文中) &amp; 本当の「合法的」な使い方ですが、現実の世界は必ずしも理想的なものほどパース可能ではありません) sed それはそれがしているやり方で振舞っている


sedの#&amp; [^;] *; ## g ' 完璧に動作します。
Peter

@ピーター:聞いていいね!私が言ったようにしかし注意しなさい:あなたが迷子のシングルをお持ちなら & 一列になっていると、パターンが鮮明になりすぎる可能性があります。入力が正しく動作していれば、問題にはなりません。そうでない場合:パターンにもっと厳密さが必要であり、すぐに sed の限界は彼ら自身を知らせるでしょう、そして他の道具が好まれるでしょう。
Daniel Andersson

0

コードを実際の文字に置き換えるほうがいいでしょうか。

echo 'Text1&#8482;
&#91;Text&#174;2&#93;
Text&#58;3' | perl -C -pe 's/&#([^;]*)/chr$1/eg'

出力:

Text1™;
[;Text®;2];
Text:;3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.