패턴이 아직 없는 경우에만 패턴과 일치하는 각 줄 아래에 줄을 추가합니다.

패턴이 아직 없는 경우에만 패턴과 일치하는 각 줄 아래에 줄을 추가합니다.

특정 내용 아래에 새 줄을 추가 할 수 있습니까 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+; print줄 바꿈에 추가하여 줄을 검색 Os 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

관련 정보