HTML 形式のテキストから取得した文字列がいくつか含まれたファイルがあり、コンソール インターフェイスでは見栄えの悪い HTML シーケンスが含まれています。次に例を示します。
Text1™
[Text®2]
Text:3
私が試みているのは、次のように & と ; の間にあるすべてを削除して、テキストを再び読みやすくすることです。
Text1
Text2
Text3
実際には、sed を使用して余分な文字を削除しようとしています。
sed 's#&*;##g' <file>
問題は、テキスト文字列から ; のみが削除されることです。
問題は、余分なチェーンを削除するために正規表現をどのようにコーディングすればよいかということです。&#[1-9]+;
答え1
正規表現
sed 's#&*;##g' <file>
は、あなたが考えているようには動作しません。*
文字は、前の文字が 0 回以上繰り返されることを示す乗数です。 前の文字は なので&
、これは、たとえば および ( の前に 0 回書かれています。 これは、テストケースで一致するものです) と一致します&&&;
が;
、&
この;
場合は望んでいるものではありません。
「どれでも乗数の前には「 . 文字」が付きます。乗数は 1 つのドットで表されます.
。
$ echo 'Text:3' | sed 's#&.*;##g'
Text3
これが最初の問題です。2 番目は、いわゆる「貪欲な」マッチングの概念です。つまり、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
そのように動作する理由を説明しています。
答え2
コードを実際の文字に置き換えた方が良いのではないでしょうか?
echo 'Text1™
[Text®2]
Text:3' | perl -C -pe 's/&#([^;]*)/chr$1/eg'
出力:
Text1™;
[;Text®;2];
Text:;3