sed: 파일에서 일치하는 항목을 모두 제거하고 첫 번째 일치 항목이 있는 일부 줄을 삽입합니다.

sed: 파일에서 일치하는 항목을 모두 제거하고 첫 번째 일치 항목이 있는 일부 줄을 삽입합니다.

/etc/ntp.conf내 구성의 자동 업데이트를 사용하고 싶다고 가정해 보겠습니다 sed. ntp.conf정의된 형식 허용목록파일 전체에 나타나는 줄에 동일한 키워드를 사용합니다. 예를 들어:

# first block occurrences
server 1.1.1.1
server 2.2.2.2

driftfile /var/lib/ntp/drift

# second block of occurrences
server 3.3.3.3
server 4.4.4.4

ntp이제 5.5.5.5, 6.6.6.6 및 7.7.7.7과 같은 서버 목록을 업데이트했습니다 . 내가 원하는 결과는 다음과 같습니다.

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

이것을 위해 사용할 수 있습니까 sed? 이 문제에 적합한 도구입니까, 아니면 다른 도구를 사용해야 합니까?

추신: 두 번째 블록(또는 두 블록 모두)의 발생을 주석 처리하는 것도 옵션일 수 있습니다.

답변1

list.txt다음과 같은 파일에 새 서버 목록이 있는 경우 cwd:

sed '/^server/{x;//!r list.txt
d}' /etc/ntp.conf

또는 파일을 사용하지 않고 새 서버 이름을 하드코딩하려는 경우:

sed '/^server/{x;//!c\
server 1\
........\
server n-1\
server n
d}' /etc/ntp.conf

이는 다음과 같이 가정합니다.주석 처리되지 않은 항목이 하나 이상 있습니다. server 철사귀하의 것에서 /etc/ntp.conf(또한 주석 처리된 줄은 제거되지 않습니다 server. 해당 줄도 포함하도록 정규식을 변경할 수 있습니다). 원본 파일에 서버 항목이 없더라도 이 줄을 삽입하려면(이 경우 새 서버가 파일 끝에 추가됨) 다음을 수행할 수 있습니다.

sed '/^server/{x;//!r list.txt
d}
${x;//!r list.txt
x}' /etc/ntp.conf

또는 원하는 경우 동일한 조건을 사용하십시오 c\. 연습용으로 남겨두겠습니다. 모든 백슬래시가 있는 줄을 변경할 때 포함된 줄 바꿈은 백슬래시로 이스케이프되어야 한다는 점을 명심하세요 c\(예제에서처럼).

답변2

sed '
/^server/ d
/first block/a\
server 5.5.5.5\
server 6.6.6.6\
server 7.7.7.7
' /etc/ntp.conf

첫 번째 항목만 변경합니다.

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

관련 정보