Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題38

問題38 込み入った文字実体参照の解決

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

$ x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

という文字化けのようなファイルを直す問題だった。文字実体参照というものをつかっているそうだが、最初自分は &... という書き方があるのかと思って随分と悩んでしまった。実際にはこれは " が " と変換された後さらに & が & となり、以降繰り返してこうなったらしい。

解答は

cat this_is_it.txt | sed -E 's/\&(amp;)+quot;/"/g'

となる。

& は sed では

パターンスペースに対して regexp のマッチを試みる。マッチに成功すると、マッチした部分を replacement に置換する。replacement には特殊文字である & を含めることができ、これはパターンスペースのマッチした部分を参照する。また   \1   から   \9   までの特殊エスケープを含むこともでき、これは   regexp    の部分正規表現(sub-expression) にマッチした部分をそれぞれ参照する。

という仕様になっているのでエスケープする。