文字列の引き算

文字列と文字列の引き算。- ブックマクロ開発に にインスパイヤされて文字列と文字列の引き算を行う関数を作ってみます。

引き方として、先頭からマッチするものを 1 つだけ引く場合、マッチする全てから引く場合、末尾から引く場合の 3 種類に対応させてみました。 引く方法は sub() または gsub() 関数を用いています。

#! /usr/local/bin/nawk -f
# str_minus.awk
# 文字列の引き算
# usage: gawk -f str_minus.awk

BEGIN {
    str1 = str1 ? str1 : "3月のライオン";
    str2 = str2 ? str2 : "ライオン";
    how  = how  ? how  : "g";

    print str_minus(str1, str2, how);
}

# str_minus():  文字列の引き算
#   in:     引かれる文字列 str1
#           引く文字列 str2
#           どうやって引くか?
#               g: マッチする全てを引く
#               1: 先頭のひとつだけ引く
#               $: 末尾から引く
function str_minus(str1, str2, how) {
    # 全てを引く場合
    if (how ~ /^[gG]$/) {
        gsub(str2, "", str1);
        return str1;
    }

    # 先頭の 1 つだけ引く場合
    if (how ~ /^1$/) {
        sub(str2, "", str1);
        return str1;
    }

    # 末尾から引く場合
    if (how ~ /^[$]$/) {
        str2 =str2 "$";
        sub(str2, "", str1);
        return str1;
    }
}

実行してみましょう。

$ gawk -f str_minus.awk
3月の

$ gawk -v str1='/test/test/test' -v str2='test' -v how='1' -f str_minus.awk
//test/test

$ gawk -v str1='/test/test/test' -v str2='test' -v how='g' -f str_minus.awk
///

$ gawk -v str1='/test/test/test' -v str2='test' -v how='$' -f str_minus.awk
/test/test/

このように引き方を分けることができます。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png