sed는 정규식으로 지정된 n번째 줄을 어떻게 대체합니까?

sed는 정규식으로 지정된 n번째 줄을 어떻게 대체합니까?

나는 해당 줄에서 지정된 일치 정규식의 세 번째(또는 더 일반적으로 n번째) 발생을 대체하기 위해 sed를 사용할 것입니다. 지금까지는 첫 번째 작업만 수행할 수 있습니다.

$cat file   
# Golden dictionary is a versatile multi purpose reference  
# Copyright (C) 2004-2008 A  
# Copyright (C) 2008-2015 B  
# Copyright (C) 2015-2016 C   

지금까지 나는 단지

$ cat file| sed -E '0,/copy/I s//No-&/'

# Golden dictionary is a versatile multi purpose reference  
# No-Copyright (C) 2004-2008 A  
# Copyright (C) 2008-2015 B  
# Copyright (C) 2015-2016 C 

게임 3만 있는 경우 어떻게 해야 하나요?

답변1

ed를 사용하면 대소문자를 구분하지 않는 세 번째 "복사본" 앞에 "No-"를 붙이면 다음과 같습니다.

ed -s file <<< $'/[Cc][Oo][Pp][Yy]/\n//\n//\ns//No-&/\nw\nq' > /dev/null

명령은 다음과 같습니다:

  • /[Cc][Oo][Pp][Yy]/-- 대소문자를 구분하지 않고 "copy:"를 수동으로 검색합니다.
  • //-- 검색을 두 번 반복합니다.
  • s//No-&/-- 마지막 일치 항목을 "No-" 접두사로 바꿉니다.
  • w-- 변경된 파일을 디스크에 쓰기
  • q——편집 종료

sed를 사용하면 변경하려는 줄 번호를 찾기 위해 몇 가지 사전 작업을 수행할 수 있습니다.

sed -i $(grep -in copy file |awk -F: 'NR==3 { print $1 }')'s/copy/No-&/i' input

왼쪽에서 오른쪽으로 작업하세요.

  • -i-- GNU sed에 대한 내부 편집 옵션
  • $( ... )-- "copy"와 일치하는 세 번째 줄 번호 찾기
    • grep -in copy file-- 대소문자를 구분하지 않고 "copy"라는 단어를 file찾아 일치하는 줄 번호를 보고 합니다.
    • awk -F: 'NR==3 { print $1 }'-- grep 출력의 라인 3에서 콜론으로 라인을 분할하고 열 1(라인 번호)을 보고합니다.
  • s/copy/No-&/i-- "복사"를 "복사 안 함"으로 바꾸세요. 대소문자를 구분하지 않습니다.

답변2

를 사용하여 awk문자열이 포함된 줄 수를 세고 Copyright세 번째 줄에 도달하면 해당 줄에서 첫 번째 항목에 대해 교체를 수행합니다.

awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file

&바꾸기에 사용된 것은 정규식이 일치하는 모든 것을 의미합니다. 이 경우 Copyright삽입할 문자열 이 됩니다 . 이 (사용 )은 예를 &들어에도 적용됩니다 .sed

첫 번째 블록 이전의 조건,

/Copyright/ && ++n == 3

Copyright문자열을 현재 줄과 일치 시킵니다 . 일치하는 항목이 있으면 n증가됩니다. 증분 값이 n3과 같으면 블록이 실행됩니다.

시험:

$ cat file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C

(파일은 귀하의 파일과 동일하지만 내용이 반복됩니다)

$ awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# No-Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C

관련 정보