라인 패턴을 편집하지 않고 패턴을 일치시킨 후 sed가 새 라인을 추가할 수 있습니까?

라인 패턴을 편집하지 않고 패턴을 일치시킨 후 sed가 새 라인을 추가할 수 있습니까?

패턴 뒤에 파일에 줄을 추가하는 방법을 찾아야 하는데 패턴이 있는 줄을 편집하고 싶지 않습니다.

예를 들어 내 원본 파일은 다음과 같습니다.

group: misc
host: server1
job: internal

나는 그것을 다음과 같이 바꾸고 싶다.

group: misc
host: server1
role: webserver
job: internal

어려운 점은 "host:"를 일치시켜야 하지만 호스트 뒤의 이름이 매번 다르다는 것입니다. 나머지 줄을 존중하고 대신 "host:"가 발견되자마자 새 줄을 덤프하여 새 줄 뒤에 호스트 이름을 고아로 남겨두기 위해 sed를 얻는 방법을 찾지 못했습니다.

답변1

a일치 후 텍스트 추가:

sed '/^host: /a\
role: webserver
' sample

또는 i일치 항목 앞에 행을 삽입하십시오.

sed '/^job: /i\
role: webserver
' sample

답변2

비슷하다마커스의 대답, $줄 끝( )을 개행 문자로 바꾸고 다음으로 시작하는 줄에 삽입하려는 줄을 바꿉니다 host:.

$ sed '/host: / s/$/\nrole: webserver/ ' file
group: misc
host: server1
role: webserver
job: internal

이를 위해서는 오른쪽으로 GNU(또는 이를 지원하는 sed다른 구현 )가 필요합니다. 위의 방법이 실패하면 다음을 시도하십시오.sed\n

$ sed '/host: / s/$/\
role: webserver/' file
group: misc
host: server1
role: webserver
job: internal

답변3

.*물론 이것은 매우 기본적인 정규식입니다.모든 것, 하나몇 번이라도;sed는 라인 기반이기 때문에 어쨌든 각 라인의 끝까지만 작동합니다.

따라서 완전한 GNU sed 호출은 다음과 같습니다.

sed 's/^host: .*$/&\nrole: webserver/'

답변4

사용sed

$ sed '/^host.*/{p;s//role: webserver/}' input_file
group: misc
host: server1
role: webserver
job: internal

관련 정보