パフォーマンスを向上させるために sed コマンドを使用したい:
sed -n '/<html>/,/<\/html>/p' filename > output
このコマンドはうまく機能します。しかし、1 つのファイルに複数の html タグがあります。そして、HTMLタグの最初の出現の間のコンテンツを抽出したい、
パフォーマンスを向上させるために sed コマンドを使用したい:
sed -n '/<html>/,/<\/html>/p' filename > output
このコマンドはうまく機能します。しかし、1 つのファイルに複数の html タグがあります。そして、HTMLタグの最初の出現の間のコンテンツを抽出したい、
これにより、最初の<html>
ブロックが得られます。
sed -n '/<html>/,/<\/html>/p;/<\/html>/q' file
例:
kent$ cat file
<html>
a
</html>
<html>
b
</html>
<html>
c
</html>
kent$ sed -n '/<html>/,/<\/html>/p;/<\/html>/q' file
<html>
a
</html>
ところで、OPがhtml/xmlを解析していたとは思いません。<html>
html には複数のタグがありません。また、彼の入力ファイルはxmlにまったくない場合があります。
grep -o を使用して、最初の<html>...</html>
ペアのみを抽出します
grep -oP "^.+?</html>" filename |head -1 | sed -n '/<html>/,/<\/html>/p' > output
ただし、sed
それ自体と同様に、<html></html>
タグが常に互いに同じ行にある場合にのみ機能します。
あなたのファイルをテキストファイルと考えてください。HTML を解析する必要がある場合は、何らかの HTML パーサーを使用する必要があります。
このコードは、コンテンツを含むタグが 1 行の場合にのみ機能することに注意してください。
最初のタグの値を取得する必要がある場合は、この行が役立ちます。
sed -n "/<html>/,/<\\/html>/{/>.*<\//{s/^[^>]*>\\([^<]*\\)<\\/.*/\1/gp;q}}" file.html
テストファイルfile.html
:
<html>
<body>
<ccc>test1</ccc><bbb>test2</bbb>
<ccc1>test3</ccc1><bbb1>test4</bbb1>
</body>
</html>
テスト:
$ sed -n "/<html>/,/<\\/html>/{/>.*<\//{s/^[^>]*>\\([^<]*\\)<\\/.*/\1/gp;q}}" file.html
test1
タグ名で値を取得するには:
sed -n "/<html>/,/<\/html>/{/<$tag>/,/<\\$tag>/{s/.*$tag>\\([^<]*\\)<\\/$tag.*/\1/gp;q}}" file.html
テスト:
$ tag=ccc
$ sed -n "/<html>/,/<\/html>/{/<$tag>/,/<\\$tag>/{s/.*$tag>\\([^<]*\\)<\\/$tag.*/\1/gp;q}}" 11
test1
$ tag=bbb
$ sed -n "/<html>/,/<\/html>/{/<$tag>/,/<\\$tag>/{s/.*$tag>\\([^<]*\\)<\\/$tag.*/\1/gp;q}}" 11
test2
$ tag=ccc1
$ sed -n "/<html>/,/<\/html>/{/<$tag>/,/<\\$tag>/{s/.*$tag>\\([^<]*\\)<\\/$tag.*/\1/gp;q}}" 11
test3
$ tag=bbb1
$ sed -n "/<html>/,/<\/html>/{/<$tag>/,/<\\$tag>/{s/.*$tag>\\([^<]*\\)<\\/$tag.*/\1/gp;q}}" 11
test4
使用awk
:
awk 'NR==1,/<\/html>/' input_file
このワンライナーは、ファイルの先頭から最初の最後の html ブロックまで始まります。最初の html ブロックの開始前に行がある場合、それらも印刷されます。