내 문제는 다음과 비슷합니다sed -i가 심볼릭 링크를 깨는 것을 방지하는 방법은 무엇입니까?, 그러나 하드 링크가 포함됩니다.
sed를 사용하여 파일을 처리하면 sed -i
파일에 있는 모든 하드 링크가 삭제됩니다. sed는 임시 파일에 쓴 다음 이동하는 방식으로 작동하기 때문입니다. 이 --follow-symlinks
매개변수는 하드 링크의 경우 도움이 되지 않습니다.
다소 추악한 접근 방식을 사용하는 것 외에 다른 옵션이 있습니까?
sed 's/cat/dog/' pet_link > pet_link
답변1
sed 's/cat/dog/'
Bourne과 유사한 쉘을 사용하여 파일 크기를 변경하지 않는 다른 대체 의 경우 다음을 수행할 수 있습니다.
sed 's/cat/dog/' < file 1<> file
35세 이상 거의 알려지지 않은 사람들기준 <>
운영자는 읽기+쓰기 모드로 파일을 엽니다.잘림 없음. 기본적으로 이는 sed
출력을 입력에 씁니다. 출력이 sed
아직 읽지 않은 파일 부분을 덮어쓰지 않도록 하는 것이 중요합니다.
파일 크기를 줄이는 교체의 경우 다음을 사용하십시오 ksh93
.
sed 's/hippopotamus/ant/' < file 1<>; file
<>;
, 리디렉션된 명령이 성공하면 명령이 완료되는 지점에서 파일이 잘린다는 점을 제외하면 ksh93
와 동일한 확장자입니다 .<>
아니면 펄을 사용하세요:
perl -pe 's/hippopotamus/ant/;
END{truncate STDOUT, tell STDOUT}' < file 1<> file
그 밖의 모든 경우에는 표준 형식을 사용하세요.
cp -i file file.back &&
sed 's/dog/horse/g' < file.back > file # && rm -f file.back
1 Bourne 쉘 및 Korn 쉘의 초기 버전에서 원래 구현이 실제로 손상되었지만 이는 1980년대 후반에 수정되었습니다. Almquist 쉘은 처음에는 이를 지원하지 않습니다.
답변2
이는sed
에스트레메응급실그것은 아니다문서편집기이기 때문에 사람들은 파일을 편집하려고 하여 이를 남용하는 경향이 있습니다. 기본적으로 -i
이 옵션은 비표준 FreeBSD 확장이며(다른 운영 체제에서는 사용할 수 없음) 두 번째로 파일을 편집하지 않습니다. 복사본을 만들고 원본 파일을 복사본으로 바꿉니다.배쉬 FAQ
또 다른 방법은ed
또는 ex
유사한 구문(Vim의 일부)을 가진 명령입니다.
ex +%s/cat/dog/e -scwq pet_link
아니면 팔로우하세요@와일드카드추천하다:
printf '%s\n' '%s/cat/dog/' x | ex pet_link
여러 파일의 경우 다음을 사용할 수 있습니다.
ex "+bufdo! %s/foo/bar/ge" -scxa **/*.lnk
쉘이 지원하는 경우새로운 와일드카드 옵션(pass: 활성화됨 shopt -s globstar
), **
이 경우 using 은 재귀적으로 작동합니다.
더 알아보기POSIX시도해 볼 수 있는 구문(따라@와일드카드제안):
for f in *.txt; do printf '%s\n' '%s/cat/dog/g' x | ex "$f"; done
또는:
find . -type f -exec sh -c 'for f; do printf "%s\n" "%s/cat/dog/g" x | ex "$f"; done' sh {} +
관련된:
답변3
조금 ed
:
$ ed pet_link <<END_OF_ED
g/cat/s//dog/
w
END_OF_ED
하드 링크는 깨지지 않습니다.
답변4
나는 이것이 잘 작동한다는 것을 알았습니다 (심볼릭 링크와 하드 링크 유지).
sed 's/cat/dog/' pet_link > pet_link.tmp
cat pet_link.tmp > pet_link
rm pet_link.tmp