web-dev-qa-db-ja.com

HTMLエンティティから文字に変換するBashスクリプト

私はこれを変える方法を探しています:

hello < world

これに:

hello < world

Sedを使用できますが、不可解な正規表現を使用せずにこれを実現するにはどうすればよいですか?

56
Marko

recodeアーカイブされたページ ; GitHubミラー ; Debianページ ):

$ echo '&lt;' |recode html..ascii
<

Linuxおよび同様のUnix-yシステムにインストールします。

$ Sudo apt-get install recode

以下を使用してMac OSにインストールします。

$ brew install recode
79
ceving

Perlの場合:

cat foo.html | Perl -MHTML::Entities -pe 'decode_entities($_);'

コマンドラインからphpを使用する場合:

cat foo.html | php -r 'while(($line=fgets(STDIN)) !== FALSE) echo html_entity_decode($line, ENT_QUOTES|ENT_HTML401);'
44
user1788934

別の方法は、次のようなWebブラウザを介してパイプすることです。

echo '&#33;' | w3m -dump -T text/html

これは、ディストリビューションのダウンロードとインストールが困難なcygwinでうまく機能しました。

この答えが見つかりました here

18
Whitecat

Xmlstarletの使用:

echo 'hello &lt; world' | xmlstarlet unesc
16
user243

BashでHTMLをエスケープする簡単な方法? これは、Stack Exchangeで(wgetを使用して)回答を取得し、HTMLを通常のASCII文字:

sed 's/&nbsp;/ /g; s/&amp;/\&/g; s/&lt;/\</g; s/&gt;/\>/g; s/&quot;/\"/g; s/#&#39;/\'"'"'/g; s/&ldquo;/\"/g; s/&rdquo;/\"/g;'

編集1:2017年4月7日-左二重引用符と右二重引用符の変換を追加しました。これは、bashスクリプトの一部であり、SEの回答をWebスクレイピングし、ここでローカルコードファイルと比較します。 buntuに質問-ローカルファイル間のコードバージョン管理とUbuntuの質問に回答


2017年6月26日編集

sedを使用すると、HTMLをAsk Ubuntu/Stack Exchangeの1K行ファイルでASCIIに変換するのに約3秒かかりました。約1秒の応答時間で置き換えます。

関数は次のとおりです。

#-------------------------------------------------------------------------------
LineOut=""      # Make global
HTMLtoText () {
    LineOut=$1  # Parm 1= Input line
    # Replace external command: Line=$(sed 's/&amp;/\&/g; s/&lt;/\</g; 
    # s/&gt;/\>/g; s/&quot;/\"/g; s/&#39;/\'"'"'/g; s/&ldquo;/\"/g; 
    # s/&rdquo;/\"/g;' <<< "$Line") -- With faster builtin commands.
    LineOut="${LineOut//&nbsp;/ }"
    LineOut="${LineOut//&amp;/&}"
    LineOut="${LineOut//&lt;/<}"
    LineOut="${LineOut//&gt;/>}"
    LineOut="${LineOut//&quot;/'"'}"
    LineOut="${LineOut//&#39;/"'"}"
    LineOut="${LineOut//&ldquo;/'"'}" # TODO: ASCII/ISO for opening quote
    LineOut="${LineOut//&rdquo;/'"'}" # TODO: ASCII/ISO for closing quote
} # HTMLtoText ()
8

A python 3.2+バージョン:

cat foo.html | python3 -c 'import html, sys; [print(html.unescape(l), end="") for l in sys.stdin]'
4
Aissen