文字を全部 0 に置き換える

文字を全部0に置き換える - みずぴー日記 にインスパイヤされて文字列を全部 0 (ゼロ) に置き換えます。

awk は

パターン {アクション}

と説明されることが多いのですが、実際にはパターンと言うのは正規表現だけを指すのではなく、

評価式 {アクション}

であり、評価式が省略された場合には、全てのレコードに対し「真」となり、アクションが省略されると print $0 と同じになります。 さらに、awk で「真」とは 0 (ゼロ) 以外を指します。

こうしたことを頭に入れておくと、以下の「一行野郎」で可能であることが分かると思います。

$ seq 10 | gawk 'gsub(/./, "0") + 1'
0
0
0
0
0
0
0
0
0
00

これは gsub() が置換に成功した際に置換した個数を返すことを利用し、空行の場合 (gsub() は 0 を返す) には空行を返すために +1 することで常に「真」になります。

もうひとつ、以下のようなものもあります。

$ seq 10 | gawk 'gsub(/./, "0") ""'
0
0
0
0
0
0
0
0
0
00

これは空行だけの場合には gsub() は 0 (ゼロ) を返しますが、0 に空文字列 ("") を連接させることで 0 (ゼロ) という数値ではなく文字列を返すため、常に「真」になります。 さらに、実は単に「連接」すれば良いわけですから、以下のようなもの (スペースを削れば 12 byte で anarchy golf - zero lines と同じ) が最短になりそうです。

$ seq 10 | gawk 'gsub(/./, "0") a'
0
0
0
0
0
0
0
0
0
00

awk の「一行野郎」は難しいですね。

参考サイト

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