16

awkはテキスト/文字列の置換を次sub()gsub()ように行うことができることを知っています:

kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb

また

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb

しかし、今日私はタイプミスを犯しました、私は次のように行を書きました:

kent$ echo "fffff"|awk '{gsub('f', "b")}1'

しかしawk、それについて文句を言うことはありませんでしたが、通常どおり出力を生成しました。もちろん、予期しない出力でした。エラーを見つけるのに時間がかかりました。awk私に与えられた出力は次のとおりです。

bfbfbfbfbfb

もう一つの例:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB

の例sub()も奇妙です:

kent$  echo "thanks in advance"|awk '{sub('a', "B")}1'
Bthanks in advance

誰かが奇妙な置換がどのように行われたかを私に説明できますか?

kent$  awk --version
GNU Awk 4.0.2

編集

ジョニからの回答ありがとうございます。多分この例はそれをよりよく説明します、私はそれをここに追加するだけです:

kent$  echo "thanks in advance"|awk '{f="k";sub('f', "B")}1'
thanBs in advance

kent$  echo "thanks in advance"|awk '{sub('th ank', "B")}1'
awk: cmd. line:2: {sub(th
awk: cmd. line:2:        ^ unexpected newline or end of string
4

1 に答える 1

22

あなたが書くとき

echo "fffff"|awk '{gsub('f', "b")}1'

awk が見ているのは{gsub(f, "b")}1. f空の値を持つ変数として解釈し、入力内のすべての空の文字列を b に置き換えます。

空文字列は各文字の間と最後の文字の後にあるため、awk はbeach の後にa を挿入しますf

未使用の変数なしで、同じ効果を//orに置き換えることができます。""

echo "fffff"|awk '{gsub(//, "b")}1'            # fbfbfbfbfb
于 2013-03-15T14:21:51.003 に答える