특정 줄의 문자열을 sed로 교체

특정 줄의 문자열을 sed로 교체

특정 줄에서 문자열을 바꾸는 방법을 알고 있습니다. 예를 들면 다음과 같습니다.

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/
        }

관련 정보