특정 줄에서 문자열을 바꾸는 방법을 알고 있습니다. 예를 들면 다음과 같습니다.
sed -i "<line number>s/<old string>/<new string>/g" <file name>
하지만 여러 줄의 문자열을 바꾸는 방법을 모르겠습니다(예: 줄 번호 1, 10, 100).
답변1
내가 아는 한, sed 주소는 한 줄만 포함할 수 있습니다.범위선.
sed -f -
그러나 쉘과 함께 표준 입력에서 읽는 명령을 사용하여 무언가를 하나로 묶을 수 있습니다. 예를 들어:
printf '%ds/<old string>/<new string>/g\n' {1,10,100} | sed -f - file
답변2
이것은 awk의 답변입니다.
awk 'NR == 1 || NR == 10 || NR == 100 {gsub(/old/,"new")}; {print}' <file name>
설명하다
NR == 1 || NR == 10 || NR == 100
: 이 줄 중 하나만에서 다음 명령을 실행합니다.gsub(/old/,"new")
:/old/
로 대체되었습니다new
.{print}
: 어느 줄에 있든 상관없이 해당 줄을 인쇄하세요.
답변3
sed를 직접 사용하는 대안:
sed '1b1; 10b1; 100b1; b ;:1;s/<old string>/<new string>/g' <file name>
줄 번호가 1, 10 또는 100과 일치하면 다른 줄에서는 레이블 1로 분기하고, 간단히 끝으로 분기합니다(기본적으로 줄이 인쇄됨).
다소 자동화됨:
sed -e $(printf '%sb1;' 1 10 100) -e 'b; :1;s/<old>/<new>/g' <file name>
POSIXly(기본 IFS 사용):
sed $(printf -- '-e %sb1 ' 1 10 100) -e 'b' -e':1' -e 's/<old>/<new>/g'
답변4
음, 어떻습니까?
sed -e '
/something_identifying_startline/,/something_identifying_endline/{
s/dog/cat/
s/black/white/
}