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