패턴 교체를 위해 sed 사용 [닫기]

패턴 교체를 위해 sed 사용 [닫기]

누구든지 이 문제를 해결하는 방법을 제안할 수 있습니까? 파일이 있고 일치하는 줄에서 처음 나타나는 패턴을 동적 값으로 바꾸고 싶다고 가정해 보겠습니다. 여기서의 패턴은 입니다 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

관련 정보