
sed(GNU sed) 4.2.2를 사용하여 다음을 수행하고 싶습니다.
- 성냥
Line1
Line2
바로 아래의 을 확인하세요Line1
.String
- 그렇지 않은 경우 -
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
또 다른 개행 문자로 대체합니다.