文字の間に w を挟む関数

文字の間にwを挟む関数 - みずぴー日記 にインスパイヤされて作ってみました。

文字の間に別の文字列をはさむにはどうすれば良いでしょうか?

  • 文字列を split 関数で文字単位に分解する (日本語を扱う場合には gawk が必要)
  • 分解された文字を for 文で順に呼び出して、別の文字列を挟む
  • 最後に余分に付けられた文字列を削除する (ここでは substr 関数を用いています)

上記のような方法でここでは解いてみます。

#! /usr/local/bin/gawk -f
# interperse.awk
# 文字の間に w をはさむ
# usage: gawk -f interperse.awk

BEGIN {
    print interperse(" w ", "うはおけ");
}

# interperse: 文字の間に別の文字列を挟む関数
#   in:     はさむ文字列 ins_str
#           はさまれる文字列 str
#   out:    文字列 str の間に文字列 ins_str のはさまれた文字列
function interperse(ins_str, str,    num_arr, arr_str, i, new_str) {
    num_arr = split(str, arr_str, "");

    for (i = 1; i <= num_arr; i++) {
        new_str = new_str arr_str[i] ins_str;
    }

    ret_val = substr(new_str, 1, length(new_str) - length(ins_str));

    return ret_val;
}

ちょっと ret_val を余分に入れていますが、こうすることでチェックする際に便利になります。 次の gawk にはデバッガが搭載される予定ですが、調べるべき値を配列や変数として定義しておくと、簡単にデバッグもできます。

  • 関数に与えられた文字列は str、文字数は num_arr、分解された文字は arr_str
  • 文字列を挟んでいった時の変化は new_str
  • 余分な文字列を削除したものは ret_val

というように追いかけやすくなります。

では実行してみます。

$ gawk -f interperse.awk
う w は w お w け

こんな感じで表示されれば「おけ」です。

正規表現でやる方法 (こちらがスマートですね)

文字の間に w を挟む関数 - jarp, からですが、さすがわたなべさんです。

なかなか "\B" とか出てこないわけですが、サクッと出るのはゴルファーだからでしょうか。

tag_gawk.png tag_gawk.png