これは私のために働いているようです。
#!/bin/bash
urldecode(){
echo -e "$(sed 's/+/ /g;s/%\(..\)/\\x\1/g;')"
}
for f in /opt/logs/*.log; do
name=${f##/*/}
cat $f | urldecode > /opt/logs/processed/$HOSTNAME.$name
done
「+」をスペースに、% 記号を「\x」エスケープに置き換え、「-e」オプションを使用して echo に \x エスケープを解釈させると、機能しませんでした。何らかの理由で、cat コマンドは % 記号を独自のエンコード形式 %25 として出力していました。そのため、sed は単に %25 を \x25 に置き換えていました。-e オプションを使用すると、単に \x25 を % として評価するだけで、出力はオリジナルと同じでした。
痕跡:
オリジナル: Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
sed: Mozilla\x252F5.0\x2520\x2528Macintosh\x253B\x2520U\x253B\x2520Intel\x2520Mac\x2520OS\x2520X\x252010.6\x253B\x2520en
echo -e: Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
修正:基本的に、sed の % の後の 2 文字は無視します。
sed: Mozilla\x2F5.0\x20\x28Macintosh\x3B\x20U\x3B\x20Intel\x20Mac\x20OS\x20X\x2010.6\x3B\x20en
echo -e: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en
広範なテストの後、これがどのような合併症を引き起こすかはわかりませんが、今のところ機能します。