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/'
포함되어 있지 않고 파일이 비어 있지 않은 한 작동합니다 .foo
bar
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
이것의 장점은 명확성과 유지 관리 용이성입니다.