2010年6月9日水曜日

sub = 文字列を、最初の1つだけ置き換える - AWK

AWKの文字列操作関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 △(全角不可)Mawk △(全角不可)awk
文字列を、最初の1つだけ置き換えます。

o 対象文字列を直接変更しますので、必要な時は、値をコピーしてから使います。
o 見つかった文字列を全部置き換える時は、「gsub = 文字列を置き換える


**** 書式
--------
sub( 置換する条件, 置換後の文字列 [, 対象文字列] )
--------

o 置換する条件 -- 正規表現で指定します。左右の/を付けます。例: /ミク/
o 置換後の文字列 -- こちらは、普通の文字列を指定します。例: "Miku"
   + 但し、文字「&」(と「\」)について特例があります。
   + 「&」は正規表現で見つかった文字列に置き換えます。「&」に変換したい時は「\\&」を使います。
   + 「\」は、特殊文字を示す文字です。「\」に変換したい時は「\\」を使います。
o 対象文字列 -- 指定した文字列を直接変更します。省略すると、変数 $0を使います。
o 戻り値 -- 置換した数
   + 0 もしくは 1 になります。

o 文字列を指定する所は、数値も指定出来ます。
   + 6桁を超える数値を指定する時は、数値から文字列に自動変換する時の最大桁数を増やします。
   + (変数CONVFMTを使用)
o なお、全角文字を使うと、結果不正になる事のある処理系もありました。ご注意下さい。
   + Mawk for Windows 1.3.3
   + original = the one true awk(updated May 1, 2007)


**** 使用例
--------
BEGIN {
  v = "ミクさん、みくさん、ミクさん。";
  n = sub(/ミク/, "Miku", v); # Mikuさん、みくさん、ミクさん。
  print v;
  print n "個を置き換えました。";

  v = "39.39139";
  n = gsub(/39/, "ミク", v); # ミク.39139
  print v;
  print n "個を置き換えました。";

  v = 39.39139; # 数値の場合
  n = sub(/39/, "ミク", v); # ミク.3914
  print v;
  print n "個を置き換えました。";
}
{
  n = sub(/ミク/, "Miku"); # 対象文字列の指定が無い時は、$0を置換します。
  print $0;
  print n "個を置き換えました。";
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 指定した条件で、文字列や数値を1箇所だけ置き換えます。
o 対象文字列を直接変更します。
o 対象文字列を省略すると、変数 $0を使います。
o 見つかった所を1箇所だけ置き換えて、置き換えた数を返します。

o 文字列の代わりに数値を指定すると、数値を文字列に変換してから使用します。
   + 長い整数を指定すると、最後の方の桁が0になったり、浮動小数点形式になります。
   + 実数を指定すると、6桁までに丸めたり、浮動小数点形式になります。
   + この動作は変える事も出来ます。詳しくは、「数値から文字列にする時に、実数を7桁以上表示させる方法

** 処理系に依存する動作
o 以下の処理系では、全角文字を使うと結果不正になる事がありました。
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)
o 例えば、v = "表ミクさん表表ミクさん\\aa"; sub(/\\/, "x", v); で正しい結果になりません。
      + Mawk for Windows 1.3.3 の場合、「表」の2バイト目を変換しました。
      + original = the one true awk(updated May 1, 2007)の場合、変数に入れた時点で「表」が文字化けしました。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3 - 全角不可。関数が非対応
o original = the one true awk(updated May 1, 2007) - 全角不可。処理系が非対応


==
関連ページ:
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > gensub = n番目に見つかった文字列を置き換える
    toupper = アルファベットを大文字にする
    tolower = アルファベットを小文字にする
    +
    gsub = 文字列を置き換える
    CONVFMT = 数値を文字列に自動変換する時の書式
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
(2010年8月23日追加。「&」の特例)
(2010年8月17日追加。確認した処理系を3つ追加)
(2010年6月10日追加。数値を指定した時の動作)