最初の行が次から始まるファイルがあります。<?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
内部的に、[...]
すべての文字はリテラル文字として扱われます。
答え2
POSIXでは基本正規表現、その動作は\?
定義されていません(GNU sedの他のエスケープシーケンスは等です)\|
。\+
ここ)。
GNU sedはデフォルトでBREを使用します。これは、これらのエスケープシーケンスをゼロまたは1つの文字と一致するのと\?
同じ意味を持つ特殊文字として扱います。?
したがって<\?xml
、0または1の<
後にxml
、matchが続くことを意味します<?xml
。BREの場合^
、、、およびのみ特殊文字$
です。*
.
\
[
したがって、テキストを一致させるには、他のすべての文字を変更しないでください。
sed -e '/^<?xml/d' <file
リテラル文字列と一致させるためにエスケープシーケンスを引き続き使用するには、有効にします。拡張正規表現(これは次のバージョンではPOSIX標準になります。):
sed -E '/^\?xml/d' <file
(sed -E
BSD sedで使用)
答え3
最初の行が[...]で始まるファイルがあり、行の先頭が一致しないことを
<?xml
確認しようとすると/^<\?xml/d
テキストの前には以下を含めることができます。BOM(バイト順表示)。これはUTF-16形式ファイル(特にWindowsシステム上のファイル)で一般的であり、以下を表すために使用されます。バイト順16ビット文字を含むファイルのバイト数。
多くの16進ダンプツール(hex
、、、hexdump
3つを表す)の1つを使用し、最初の数文字を見るとod -c
これを確認できます。最初の2文字で、またはFF FE
が表示されている場合はFE FF
BOMです。
BOM を維持する方が良いかもしれないので、RE から出発線の要件を簡単に取り除くことで、解決策が最良に達成されます。
ちなみに、XMLファイルからデータを抽出する場合は、通常REにデータをマイニングするよりも適切に解析する方が良いでしょう。 (もちろん例外もありますが、ファイル、コメント構造などの予期せぬ効果的な再フォーマットを可能にする一般的なケースについて話しています。)
答え4
これがxml変換の結果である場合(xsltprox foo.xsl bar.xml
たとえば、xml行は最初の行にのみあります)。
次のいずれかの方法を使用します。
awk 'NR>1'
パイプラインにある場合は、次のいずれかを実行します。
awk 'FNR>1' file1 file2 ... > result
ファイルが複数あります。
sed -i -e 1d file1 file2 ...