削除方法

削除方法

最初の行が次から始まるファイルがあります。<?xml

sedを使用して削除できます。

/<\?xml/d

しかし、行が始まるかどうかを確認しようとすると -

/^<\?xml/d

一致しません。
しかし、他の行、例えば

<head ...

削除されました

/^<head/d

私も試しました

/^\<\?xml/d

しかし、一致するものはありません。

ベストアンサー1

使用:

sed '/^<?xml/d' filename

GNU sed は、\?前の文字の 0 個または 1 個を表します。 (POSIX sedでは\?定義されていません。)リテラルを一致させるために?エスケープしないでください。

はい

このテストファイルを考えてみましょう。

$ cat filename
<?xml deleteme
<.xml keepme
..xml keepme

上記の解決策は望ましい結果をもたらしました。

$ sed '/^<?xml/d' filename
<.xml keepme
..xml keepme

質問の最初のコマンドは結果を誤って生成します。

$ sed '/<\?xml/d' filename
$

これはxml、オプションの先行を含むすべての行と一致するためです<。すべての行が含まれているため、xmlすべて削除されます。

2番目のコマンドは何も削除しません。

$ sed '/^<\?xml/d' filename
<?xml deleteme
<.xml keepme
..xml keepme

<これにより、0または1で始まるすべての行が削除されます。まもなく合格xml。行には<常にとの間に1つ以上の文字があるため、xml行は削除されません。

疑わしいときに文字を脱出する方法

文字が正規表現であるかどうかわからず無効にしたい場合は、角かっこ内に入れるのが安全です。

$ sed '/^[<][?]xml/d' filename
<.xml keepme
..xml keepme

内部的に、[...]すべての文字はリテラル文字として扱われます。

おすすめ記事