누구든지 이 문제를 해결하는 방법을 제안할 수 있습니까? 파일이 있고 일치하는 줄에서 처음 나타나는 패턴을 동적 값으로 바꾸고 싶다고 가정해 보겠습니다. 여기서의 패턴은 입니다 as
.
소스 파일:
a b c as aa as
as b d f aa sa
df as kf as df
대상 파일:
a b c 1 aa as
2 b d f aa sa
df 3 kf as df
답변1
교체 모드는 매번 변경되므로 이는 아마도 좀 더 이상한 일이 될 것입니다.
awk 'BEGIN { needle=1 } /as/ { $0=gensub( /as/, needle, 1, $0 ); needle=needle+1} { print } ' /path/to/input
위 내용은 다음에 적용됩니다.GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
답변2
정말로 sed를 사용하고 싶다면 while 루프 내에서 훌륭하게 수행할 수 있습니다.
count=1;
while read line
do sed 's/as/'"$count"'/1' <<< "$line";
count=$((count+1));
done < source_file >> target_file
sed 명령 내에서 사용하기 위해 변수를 적절하게 확장하려면 쉘에 둘러싸는 ''
쌍이 필요합니다."$count"
더 짧습니다(Kusalananda에게 감사드립니다):
while read line
do sed 's/as/'"$(( ++count ))"'/1' <<< "$line";
done < source_file > target_file
패턴이 발견될 때만 증가시키려는 경우:
count=1;
while read line;
do sed '/as/! {q100}; s/as/'"$count"'/1' <<< "$line";
[[ "$?" -eq 0 ]] && (( ++count ));
done < source_file > target_file
답변3
그리고perl
$ perl -pe 'BEGIN{$n=1} s/as/$n++/e' file
a b c 1 aa as
2 b d f aa sa
df 3 kf as df
답변4
다음은 필요한 작업을 수행하는 작은 Python 스크립트입니다.
#!/usr/bin/env python
import sys
counter = 0
with open(sys.argv[1]) as fd:
for line in fd:
new_words = []
words = line.strip().split()
found = False
for word in words:
val = word
if word == 'as' and not found:
counter += 1
found = True
val = str(counter)
new_words.append(val)
print(" ".join(new_words))
그리고 테스트 실행을 하려면:
$ ./substitute_dynamic_val.py input.txt
a b c 1 aa as
2 b d f aa sa
df 3 kf as df