次のようなXMLタグを含むファイルがたくさんあります。
_<h> PIDAT <h> O
_
その行の最初の_<h>
_の後に来るものをすべて削除する必要があるので、これを取得できます。
_<h>
_
そのために私は使用しています
sed -i -e 's/(^<.*?>).+/$1/' *.conll
しかし、sedが_$1
_を認識していないようです。 (私が理解しているように、_$1
_はグループに含まれていないものをすべて削除する必要があります)。これを達成する方法はありますか?正しい方向に向けていただければ幸いです。
PS:これらの式を正規表現アプリでテストしましたが、動作しましたが、コマンドラインからは動作しませんでした。
sed
後方参照の形式は\1
、\2
などです。$1
はPerlに似ています。また、基本正規表現(BRE)を使用する場合は、(...)
と?
および+
だけでなく、括弧をエスケープしてグループを形成する必要があります。または、-E
オプションで拡張正規表現を使用できます。
Sed正規表現は貪欲であるため、<.*>
は最初の<h> PIDAT <h>
で停止するのではなく、その行の>
と一致します。また、.*?
は意味がありません(.*
はすでに何にも一致しないため、?
を使用してオプションにすることは不要です)。
これはうまくいくかもしれません:
sed -i -Ee 's/^(<[^>]*>).*/\1/' *.conll
[^>]
は>
以外のすべてと一致するため、<[^>]*>
は<h>
と一致しますが、<h> PIDAT <h>
とは一致しません。