생성해야 할 양식 편지가 많이 있습니다.
$>cat debug-form-letter
The first field is $1, the second $2, the third $3,
the 10th field is $10,but the 10th correct value is varA.
$> cat debug-replace-value
var1|var2|var3|var4|var5|var6|var7|var8|var9|varA|varB
$> cat debug-replace-form-letter.awk
BEGIN {FS = "|"
while (getline <"debug-form-letter")
line[++n] = $0
}
{for (i = 1; i <= n; i++) {
s = line[i]
for (j = 1; j <= NF; j++)
gsub("\\$"j, $j, s)
print s
}
}
나는 이것을 통해 전화한다
$> awk -f debug-replace-form-letter.awk debug-replace-value
--10 나는 이것을 원한다
The first field is var1, the second var2, the third var3,
the 10th field is varA,but the 10th correct value is varA.
--20 하지만 이해해요
The first field is var1, the second var2, the third var3,
the 10th field is var10,but the 10th correct value is varA.
위의 $10은 올바르지 않습니다. $1 + 0이 됩니다. 큰따옴표와 작은따옴표를 시도해 보았지만 작동하지 않습니다.
그리고 11달러는 1더하기 1이 됩니다.
내 awk는 4.1.3이고 최신 버전으로 업데이트했는데 작동하지 않습니다.
$> awk -V
GNU Awk 4.1.3, API: 1.1
Copyright (C) 1989, 1991-2015 Free Software Foundation.
내 스크립트에 무슨 문제가 있나요? 어떻게 작동하게 할 수 있나요?
답변1
$1
교체시에는 (및 등)의 초기 부분 도 교체해야 합니다 . 는 로 대체되므로 나머지로 대체됩니다.$10
$11
$12
$1
var1
$10
var10
var1
0
$10
관심 있는 특정 숫자에만 일치하고 그 이상은 일치하지 않도록 정규식을 좀 더 구체적으로 작성해야 합니다.
이를 올바르게 수행하는 방법에는 두 가지가 있습니다.
- 올바른 내용과 일치하도록 대체 항목의 정규식을 수정합니다(하드).
$10
가장 긴 문자열을 먼저 일치시킵니다. 예를 들어 from$1
대신 from$1
to$10
(또는 변수가 많은 경우) 순서로 바꿉니다 .
두 번째 옵션을 사용하세요.
awk 'NR == FNR { split($0, vars, "|"); next }
{ for (i = length(vars); i >= 1; --i) gsub("\\$" i, vars[i]) } 1' debug-replace-value debug-form-letter
특정 텍스트에 대해 다음이 생성됩니다.
The first field is var1, the second var2, the third var3,
the 10th field is varA,but the 10th correct value is varA.