最初の行が次から始まるファイルがあります。<?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
内部的に、[...]
すべての文字はリテラル文字として扱われます。