sed 스크립트는 패턴이 있는 모든 줄을 제거하고 끝에 줄을 추가합니다.

sed 스크립트는 패턴이 있는 모든 줄을 제거하고 끝에 줄을 추가합니다.

foo파일이 또는 을 포함하는 여러 줄로 복잡해졌습니다 bar. 모두 제거하고 끝에 한 줄을 추가하고 싶습니다.

그래서 주어진 파일

some stuff
foo1
foo2
bar=42
some other stuff
bar
foo
more stuff

sed 스크립트가 반환되어야 합니다.

some stuff
some other stuff
more stuff
foo
bar

sed를 사용해 보았는데 마지막 줄에 둘 다 '/foo/d;/bar/d;$s/$/\nfoo\nbar/'포함되어 있지 않고 파일이 비어 있지 않은 한 작동합니다 .foobar

foo마지막 줄에서도 작동하게 하려면 어떻게 해야 합니까? 전체 스크립트가 이보다 더 많은 일을 해야 하기 때문에 나는 sed를 계속 사용하고 싶습니다. 물론 스크립트 뒤에 echo가 포함된 줄을 추가할 수도 있지만 올인원 솔루션은 없는지 궁금합니다.

편집하다:빈 파일 상자는 처리할 필요가 없습니다.

답변1

두 번째 조건을 추가해야 합니다. 마지막 행이 아닌 경우에만 삭제하고 a일치 후 행을 삭제하려면 교체 대신 마지막 행에 보류를 사용합니다.

sed -E '/foo|bar/{$!d
}
${a\
foo\
bar
//d
}' infile

답변2

( sed -e '/foo/d' -e '/bar/d' data.in; cat <<END
foo
bar
END
) >data.out

원하지 않는 줄을 제거한 sed다음 필요한 후행 줄을 추가 cat하고 새 파일에 출력하면 됩니다.

또는 printf대신 사용하십시오 cat:

( sed -e '/foo/d' -e '/bar/d' data.in; printf 'foo\nbar\n' ) >data.out

아니면 두 단계로,

sed -e '/foo/d' -e '/bar/d' data.in >data.out
printf 'foo\nbar\n' >>data.out

이것의 장점은 명확성과 유지 관리 용이성입니다.

관련 정보