於 Debian Linux 的 Bash Shell 中, 使用下述命令, 可以正常執行, 並得到正確結果~ (過濾特殊符號, 全形 轉 半形, 大寫轉小寫 等.)
cat /tmp/log |
sed "s/[@|!|#|/|$|%|︿|*|(|)|;|。|:|&|?|、|\?|,|'|\"|\/]//g" |
sed "s/\s*//g" |
sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/' |
sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' |
sed -e 'y/1234567890/1234567890/' |
tr '-' "\n" |
tr '[A-Z]' '[a-z]'
上述為方便閱讀, 分別斷行, 實際完整為一行命令.
但是於 Crontab 中, 卻出現下述錯誤訊息:
sed: -e expression #1, char 108: strings for `y' command are different lengths
註: sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/' 可將全形 a-z 轉換成半形的 a-z
錯誤訊息 中譯
msgid "strings for `y' command are different lengths"
msgstr "y 命令的字串長度不同"
主要問題出在 全形 轉 半形
, 於自己的 Shell 可以執行, 應該是 Crontab 的環境變數問題.
- Crontab 環境變數觀察可見: Crontab 基本環境變數
- 自己目前的環境變數可見: 於 Shell 輸入
export
即可.
觀察結果
主要差異有下述三個:
declare -x LANG="en_US.UTF-8"
declare -x LC_ALL="zh_TW.UTF-8"
declare -x LC_CTYPE="it_CH.ISO_8859-1"
解法
測試結果確定是 LANG 的問題, 於 Crontab 中, 指定 LANG="en_US.UTF-8" 即可.
程式改寫如下: (增加 export LANG="en_US.UTF-8"; 即可)
export LANG="en_US.UTF-8"; cat /tmp/log | sed "s/[@|!|#|/|$|%|︿|*|(|)|;|。|:|&|?|、|\?|,|'|\"|\/]//g" | sed "s/\s*//g" | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/' | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' | sed -e 'y/1234567890/1234567890/' | tr '-' "\n" | tr '[A-Z]' '[a-z]'
Crontab 基本環境變數及本篇Blog
超讚,謝謝您,我解決了crontab發信(mutt),中文主旨及內文亂碼的問題了
謝謝您。
呵呵, 很高興能對您有幫助. 🙂