string3이 포함된 줄에서 string1을 string2로 바꿉니다. string1이 여러 번 나타납니다.

string3이 포함된 줄에서 string1을 string2로 바꿉니다. string1이 여러 번 나타납니다.

다음 명령을 사용하여 다른 문자열(string3)이 포함된 줄에서 특정 문자열(string1을 string2로 대체)을 바꿉니다.

  sed -i '/string3/ s/string1/string2/' file.txt

질문...

위 명령은 제대로 작동하지만 string3이 포함된 줄에서 string1이 처음 나타날 때 string1을 string2로 바꿉니다.

string1의 모든 항목이 대체되었는지 확인하기 위해 명령을 여러 번 실행해야 했습니다.

  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt

한 단계에서 string3이 포함된 줄에서 string1의 모든 항목을 바꾸는 방법이 있습니까?

이는 bash 파일을 축소하는 데 도움이 됩니다.

매우 감사합니다.

답변1

당신이 해야 할 일은 sed의 "전역 대체" 플래그를 끝에 추가하는 것뿐입니다:

sed -i '/string3/ s/string1/string2/g' file.txt

답변2

완전성을 기하기 위해 이 경우 확실한 해결책은 플래그를 추가하는 것이지만 경우에 따라 (또는) 명령을 여러 번 g실행해야 할 수도 있습니다 .s/string1/string2/s/string1/string2/g

예를 들어, 입력이 not , but 인 string2경우 str다음과 같습니다.

string1ing1

s/string1/str/g결과는 다음과 같습니다.

string1

원하는 경우 str다른 것이 필요합니다 s/string1/str/g. 이를 위해 sed다음 t을 사용하여 성공하는 한 대체를 실행하는 관용적 방법이 있습니다.

sed '
  /string3/{
    :1
    s/string1/string2/
    t1
  }'

t:1명령이 성공한 경우에만 레이블로 분기합니다 s.

답변3

질문에 태그가 지정되어 sed있고 위에 완벽한 답변이 있지만, 여기에는 해당 질문을 찾는 사람들을 위한 awk 버전이 있습니다.

awk '/string3/{gsub("string1", "string2", $0)}1' infile.txt 

관련 정보