파일을 제자리에서 "잘라내기"로 변경할 수 있나요?

파일을 제자리에서 "잘라내기"로 변경할 수 있나요?

이것man페이지별로 희망을 주지는 않지만 문서화되지 않은(및/또는 GNU 특정) 기능이기를 바랍니다.

답변1

이것더 많은 유틸리티우분투의 패키지(그리고데비안sponge) 문제를 해결할 수도 있는 프로그램이 있습니다 .

스폰지맨에서:

Sponge는 표준 입력을 읽고 이를 지정된 파일에 씁니다. 쉘 리디렉션과 달리 스폰지는 출력 파일을 열기 전에 모든 입력을 흡수합니다. 이를 통해 동일한 파일을 읽고 쓰는 파이프를 제한할 수 있습니다.

이렇게 하면 다음과 같은 작업을 수행할 수 있습니다.

cut -d <delim> -f <fields> somefile | sponge somefile

답변2

당신은 할 수 없습니다. ed, GNU sed 또는 perl을 사용하거나 콘텐츠에 대한 새 파일을 만드는 등 뒤에서 수행하는 작업을 수행합니다.

ed, 휴대용:

ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF

그누 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. 이렇게 하면 비표준 도구에 의존할 필요가 없고 작업에 가장 적합한 도구를 사용할 수 있으며 중단이 발생할 때 동작을 제어할 수 있습니다.

답변3

나는 그것이 그 자체로는 가능하지 않다고 생각한다 cut. 매뉴얼이나 정보 페이지에서 찾을 수 없습니다. 당신은 다음과 같은 것을 할 수 있습니다

mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file

mktemp출력을 파이프로 연결할 수 있는 비교적 안전한 임시 파일을 제공합니다 cut.

답변4

POSIX Awk와 함께 후루룩 소리를 사용할 수 있습니다:

cut -b1 file | awk 'BEGIN{RS="";getline<"-";print>ARGV[1]}' file

관련 정보