와 동등한 것을 원한다면 sed -i.bak
매우 간단합니다.
GNU sed에 대한이 스크립트를 고려하십시오.
#!/bin/sh
# Create an input file to demonstrate
trap 'rm -r "$dir"' EXIT
dir=$(mktemp -d)
grep -v '[[:upper:][:punct:]]' /usr/share/dict/words | head >"$dir/foo"
# sed program - removes 'aardvark' and 'aardvarks'
script='/aard/d'
##########
# What we want to do
sed -i.bak -e "$script" "$dir"
##########
# Prove that it worked
ls "$dir"
cat "$dir/foo"
표시된 줄을 간단히 바꿀 수 있습니다.
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
기존 파일을 백업으로 이동하고 새 파일을 씁니다.
우리가
sed -i -e "$script" "$dir" # no backup
약간 더 복잡합니다. sed의 출력을 대체하도록 지시하기 전에 표준 입력으로 읽을 파일을 열고 링크를 해제 할 수 있습니다.
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
서브 쉘에서이 작업을 수행 한 후에도 원래 stdin을 계속 사용할 수 있습니다. 서브 쉘없이 입력을 전환하고 다시 전환하는 것이 가능하지만이 방법은 나에게 더 명확 해 보입니다.
새 foo
파일을 만들지 않고 먼저 복사 해야합니다. 파일이 둘 이상의 이름으로 알려져 있고 (예 : 하드 링크가있는 경우) 링크를 끊지 않도록하려면 중요합니다. .
/usr/gnu/bin/sed
-i 지원을 받으려면 사용하십시오 .