2

パフォーマンスを向上させるために sed コマンドを使用したい:

sed -n '/<html>/,/<\/html>/p' filename > output

このコマンドはうまく機能します。しかし、1 つのファイルに複数の html タグがあります。そして、HTMLタグの最初の出現の間のコンテンツを抽出したい、

4

5 に答える 5

2

これにより、最初の<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にまったくない場合があります。

于 2013-05-29T12:06:29.267 に答える
0

grep -o を使用して、最初の<html>...</html>ペアのみを抽出します

grep -oP "^.+?</html>" filename |head -1 | sed -n '/<html>/,/<\/html>/p' > output

ただし、sedそれ自体と同様に、<html></html>タグが常に互いに同じ行にある場合にのみ機能します。

于 2013-05-29T11:48:37.167 に答える
0

あなたのファイルをテキストファイルと考えてください。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
于 2013-05-29T11:28:24.020 に答える
0

使用awk:

awk 'NR==1,/<\/html>/' input_file

ノート:

このワンライナーは、ファイルの先頭から最初の最後の html ブロッ​​クまで始まります。最初の html ブロッ​​クの開始前に行がある場合、それらも印刷されます。

于 2013-05-29T12:39:55.327 に答える