Crontab 的 sed 出現 "y 命令的字串長度不同" 解法

於 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 的環境變數問題.

觀察結果

主要差異有下述三個:


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]'


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Crontab 的 sed 出現 "y 命令的字串長度不同" 解法 有 2 則回應

  1. 熱血阿益 說道:

    Crontab 基本環境變數及本篇Blog
    超讚,謝謝您,我解決了crontab發信(mutt),中文主旨及內文亂碼的問題了
    謝謝您。

  2. Tsung 說道:

    呵呵, 很高興能對您有幫助. 🙂

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料