現在、私は AWK を使用して、パターンの最初の 3 つの出現後の文字列の一部を検索して置換しています。文字列は次のようにフォーマットされており、func(tempID="39849235",count='12');
次に示すように、ファイル内にはこのような文字列が多数あります。
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
使用このリンクAWK を使用して文字列の最初の 3 つのインスタンスを検索して置換する方法を見つけることができました。必要な操作に合わせて変更しました。スクリプトの一部を以下に示します。
id=12349876
awk -v id="$id" 'BEGIN {matches=0}
matches < 3 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id"\""); matches++ }
{ print $0 }' filName.py >filName.py.changed
上記のコードの目的は、tempID を含む任意の行に一致し、tempID に割り当てられた番号を という変数に保持されている値に置き換えることです$id
。検索と置換はうまく機能しますが、今度はインスタンス 4 ~ 9 を別の番号に置き換えたいと思います。次の方法を試しましたが、それでも tempID の最初の 5 つのインスタンスのみが置き換えられました。
id2=39843237
awk -v id2="$id2" 'BEGIN {matches=4}
matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\""); matches++ }
{ print $0 }' filName.py >filName.py.changed
その範囲の値が置き換えられるように実装する別の方法はありますか? AWK を使用する必要はなく、sed または他の Linux ユーティリティを使用することもできます。さらに、ソリューションは必ずしも特定の時点で終了する必要はなく、3 行目以降のすべてのインスタンスを置き換えることができますが、これを実行できるソリューションがあれば、それはプラスになります。
答え1
およびmatches=4
は、matches < 9
「すでに 4 つの一致があったと仮定し、合計 9 つになるまで実行する」という意味です。これが、最初の 5 つのインスタンスが置き換えられる理由です。以前と同じように 0 から開始し、下限をロジックに含める必要があります。
id2=39843237
awk -v id2="$id2" 'BEGIN {matches=0}
matches >=3 && matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\"") }
/.*tempID.*/ { matches++ }
{ print $0 }' filName.py >filName.py.changed
の値に応じて置換を行う必要があることに注意してくださいmatches
。ただし、一致が発生するたびにこの値を増やす必要があります。元のコードでは、テキストを置き換えて1つのブロックで値を増やしていました。高すぎるために置換が行われなかった場合、matches
値はそれ以上増加しませんでしたが、それはもう問題ではありませんでした。これで、この単純なアプローチではうまくいきません。matches
低すぎるただし、一致する文字列が見つかった場合は、値を増やす必要があります。
したがって、別々の条件を持つ 2 つの{}
ブロックがあります。