sed, 아직 존재하지 않는 경우에만 일치하는 줄을 추가합니다.

sed, 아직 존재하지 않는 경우에만 일치하는 줄을 추가합니다.

sed(GNU sed) 4.2.2를 사용하여 다음을 수행하고 싶습니다.

  1. 성냥Line1
  2. Line2바로 아래의 을 확인하세요 Line1.String
  3. 그렇지 않은 경우 - String뒤에 추가 Line1(또는 앞에 삽입 Line2)

내가 시도한 것:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

그러나 그것은 다음을 반환합니다:

라인1
스트링
라인2
스트링
라인3

나는 또한 다음을 시도했습니다.

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

하지만 그것은 돌아온다

sed: -e 표현식 #1, 문자 0: 일치하지 않는 `{'

나는 sed를 사용하여 다른 방법으로 이를 수행하는 방법을 알고 있지만 위에서 설명한 대로 정확한 방법으로 이를 달성하는 방법을 이해하려고 노력합니다. 또한 내 코드에 어떤 문제가 있는지 알려주십시오.

답변1

노력하다:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

한정: 두 줄이 Line1연속으로 나타나면 원하는 대로 작동할 수도 있고 그렇지 않을 수도 있습니다.

이 테스트 파일을 고려해 보겠습니다.

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

그리고 다음 명령을 적용해 보겠습니다.

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

작동 원리

  • Line1/{...}

    이는 현재 줄이 regex 와 일치하는 경우에만 중괄호 안의 명령을 실행합니다 Line1.

  • N

    이는 다음 줄을 읽고 두 줄을 줄바꿈으로 구분하여 현재 줄에 추가합니다.

  • /\nString$/b

    두 번째 줄이 regex 와 일치하면 \nString$나머지 명령("branch", b)을 건너뜁니다.

  • s/\n/\nString\n/

    이는 첫 번째 줄과 두 번째 줄을 구분하는 개행 문자를 개행 문자와 그 뒤에 String또 다른 개행 문자로 대체합니다.

관련 정보