文字列の最初と最後にあるスペースとタブを削除

codeなにがし::phpでの空白削除を見て、以前AWK Users JP :: 行末の空白の削除というものを書きましたが、特に関数化していなかったので、trim() 関数を作成してみました。 ただし、ここで作成する trim() 関数は awk 以外の言語でしばしば実装されている trim() 関数と同じ挙動を示すかどうかは一切考慮していません。

awk での最初と最後にあるスペースとタブの削除は sub() 関数を用いますが、sub() 関数と gsub() 関数は共に元の文字列 (第 3 引数) を破壊してしまいます。 したがって、ここでは一旦別の変数 tmp_str に移してから、これに対して sub() 関数を適用します。 具体的なコードは以下のとおりです。

#! /usr/local/bin/nawk -f
# trim.awk
# 文字列の最初と最後にあるスペースとタブを削除します。
# usage: nawk -f trim.awk foo.txt

{
    print trim($0);
}

# trim():   文字列の最初と最後にあるスペースとタブを削除した文字列を返す
#   in:     文字列
#   out:    最初と最後にあるスペースとタブを削除した文字列
function trim(str,      tmp_str) {
    tmp_str = str;                          # 一旦別変数に格納しないと破壊される
    sub(/^[ \t]+/, "", tmp_str);            # 行頭のスペースとタブの削除
    sub(/[ \t]+$/, "", tmp_str);            # 行末のスペースとタブの削除
    return tmp_str;
}

実行してみることにします。

$ echo "\t test \t " | od --format=a
0000000  ht  sp   t   e   s   t  sp  ht  sp  nl
0000012

$ echo "\t test \t " | nawk -f trim.awk | od --format=a
0000000   t   e   s   t  nl
0000005

od コマンドの結果を用いると明らかにタブ (ht) とスペース (sp) が削除されていることが分かります。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png