답변:
당신은 할 수 없습니다. ed 또는 GNU sed 또는 perl을 사용하거나 컨텐츠 뒤에서 새 파일을 작성하는 등의 작업을 수행합니다.
ed
휴대용 :
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
GNU sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
펄 :
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, 새 파일 만들기 (스크립트가 중단되면 다시 실행할 수 있으므로 권장) :
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
파일을 제자리에 교체합니다 (의 소유권과 권한은 유지 foo
하지만 중단되지 않도록 보호해야 함).
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
cut
기반 방법 중 하나를 사용하는 것이 좋습니다 . 이렇게하면 비표준 도구에 의존하지 않고 작업에 가장 적합한 도구를 사용할 수 있으며 인터럽트 동작을 제어 할 수 있습니다.
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. 원자 rm foo
이기 mv foo.new foo
때문에을 호출해서는 안됩니다 . 이전 버전을 제거하고 새 버전을 동시에 배치합니다.
글쎄, cut
읽기보다 적은 출력을 생성하기 때문에 다음을 수행 할 수 있습니다.
cut -c1 < file 1<> file
즉, stdin file
을 읽기 전용 모드로 file
열리고 stdout 을 자르지 않고 읽기 + 쓰기 모드로 열어야합니다 ( <>
).
그렇게 cut
하면 파일 자체를 덮어 씁니다. 그러나 나머지 파일은 그대로 유지됩니다. 예를 들어 다음이 file
포함 된 경우 :
foo
bar
출력은 다음과 같습니다 :
f
b
bar
이 f\nb\n
대체 foo\n
되었지만 bar
여전히 있습니다. cut
완료 한 후 파일을 잘라야합니다 .
을 사용하면 명령이 성공하면 파일 설명자에서 호출되는 것을 제외하고 작동하는 연산자로 ksh93
수행 할 수 있습니다 . 그래서:<>;
<>
ftruncate()
cut -c1 < file 1<>; file
다른 쉘에서는 다음 ftruncate()
과 같은 다른 수단을 통해 비아 를 수행해야합니다 .
{ cut -c1 < file; perl -e 'truncate STDOUT, tell STDOUT';} 1<> file
perl
그것을 위해 호출 하는 것은 여기에서 약간 과잉입니다. 특히 그것이 perl
쉽게 다음 cut
과 같은 일 을 할 수 있다는 것을 고려하면 :
perl -pi -e '$_ = substr($_, 0, 1)' file
실제 내부 다시 쓰기와 관련된 모든 방법을 사용하여 작업이 중간에 중단되면 파일이 손상 될 수 있습니다. 임시 두 번째 파일을 사용하면이 문제를 피할 수 있습니다.
.old
전체 변경 방법 보다 우수echo "$(cut -d , -f 1,3 <foo)" > foo