web-dev-qa-db-ja.com

$ 1はsedでは機能しません

次のようなXMLタグを含むファイルがたくさんあります。

_<h> PIDAT <h> O_

その行の最初の_<h>_の後に来るものをすべて削除する必要があるので、これを取得できます。

_<h>_

そのために私は使用しています

sed -i -e 's/(^<.*?>).+/$1/' *.conll

しかし、sedが_$1_を認識していないようです。 (私が理解しているように、_$1_はグループに含まれていないものをすべて削除する必要があります)。これを達成する方法はありますか?正しい方向に向けていただければ幸いです。

PS:これらの式を正規表現アプリでテストしましたが、動作しましたが、コマンドラインからは動作しませんでした。

4

sed後方参照の形式は\1\2などです。$1はPerlに似ています。また、基本正規表現(BRE)を使用する場合は、(...)?および+だけでなく、括弧をエスケープしてグループを形成する必要があります。または、-Eオプションで拡張正規表現を使用できます。

Sed正規表現は貪欲であるため、<.*>は最初の<h> PIDAT <h>で停止するのではなく、その行の>と一致します。また、.*?は意味がありません(.*はすでに何にも一致しないため、?を使用してオプションにすることは不要です)。

これはうまくいくかもしれません:

sed -i -Ee 's/^(<[^>]*>).*/\1/' *.conll

[^>]>以外のすべてと一致するため、<[^>]*><h>と一致しますが、<h> PIDAT <h>とは一致しません。

6
muru