다음 명령을 사용하여 다른 문자열(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