패턴이 아직 존재하지 않는 경우에만 패턴과 일치하는 각 줄 아래에 줄을 추가하세요.

패턴이 아직 존재하지 않는 경우에만 패턴과 일치하는 각 줄 아래에 줄을 추가하세요.

sed특정 내용 아래에 새 줄을 추가하고 입력 내용이 있는 경우 이를 유지할 수 있습니까 ?

파일의 현재 내용ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

필수 파일 내용ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

다음 명령을 사용하여 콘텐츠를 추가할 수 있습니다.

sed -i '/Os version rhel5.6/a apache 4.2' ssss

내 질문

파일에 지정된 내용이 있는 경우 해당 내용 아래에 줄을 추가한 다음 유지하고 싶습니다. 콘텐츠가 없으면 추가하세요.

답변1

perl표현은 목적을 달성할 수 있습니다.

perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss

설명하다

  • next if /apache 4.2/일치하는 줄을 건너뜁니다 apache 4.2.
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; printOs version rhel5.6줄 바꿈에 추가되는 동일한 줄로 줄을 검색 하고 바꿉니다 apache 4.2.

입력 파일로 테스트

$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

답변2

한 가지 방법은 다음과 같습니다 sed.

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

이는 apache 4.2일치하는 모든 라인에 무조건 추가한 Os version rhel5.6다음(마지막 라인이 아닌 경우) n다음 라인을 통해(인쇄 패턴 공간) 끌어오고 새 패턴 공간 내용이 일치하면 apache 4.2 삭제합니다. 선행/후행 공백을 포함해야 하는 경우 정규식을 조정하세요./^[[:blank:]]*apache 4\.2[[:blank:]]*$/d

관련 정보