Câu trả lời:
OS X sử dụng kết hợp các công cụ BSD và GNU, vì vậy tốt nhất là luôn kiểm tra tài liệu (mặc dù tôi đã có nó less
thậm chí không phù hợp với trang web của OS X):
sed lấy đối số sau -i
làm phần mở rộng cho các bản sao lưu. Cung cấp một chuỗi rỗng ( -i ''
) để không sao lưu.
Sau đây nên làm:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Đây -type f
chỉ là thực hành tốt; sed sẽ phàn nàn nếu bạn cho nó một thư mục.
-exec
được ưa thích hơn xargs
; bạn không cần bận tâm với -print0
bất cứ điều gì. Các {} +
tại các phương tiện kết thúc mà find
sẽ nối tất cả kết quả như các đối số cho một ví dụ của lệnh gọi, thay vì tái chạy nó cho mỗi kết quả. (Một ngoại lệ là khi số lượng đối số dòng lệnh tối đa được HĐH cho phép bị vi phạm; trong trường hợp đó find
sẽ chạy nhiều hơn một phiên bản.)
%
ký tự : sed "s%localhost/site%blah/blah%"
. Một cách khác là dấu gạch chéo ngược - thoát khỏi dấu phân cách : sed "s/localhost\/site/blah\/blah/"
.
illegal byte sequence
lỗi? Nếu vậy, hãy thử : LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
, nó làm việc cho tôi.
/g
cho nhiều số lần nhưLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Đối với mac, một cách tiếp cận tương tự hơn sẽ là:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Là một giải pháp thay thế, tôi đang sử dụng giải pháp này trên Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Tín dụng đi đến: câu trả lời của Todd Cesere
Không có điều nào ở trên hoạt động trên OSX.
Làm như sau:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Phiên bản hoạt động trên cả Linux và Mac OS X (bằng cách thêm công -e
tắc vào sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
Bất cứ khi nào tôi gõ lệnh này, tôi dường như luôn hất nó lên hoặc quên một lá cờ. Tôi đã tạo một Gist trên github dựa trên câu trả lời của TaylanUB, một công cụ tìm kiếm toàn cầu thay thế từ thư mục hiện tại. Đây là Mac OSX cụ thể.
https://gist.github.com/nateflink/9056302
Thật tuyệt vì bây giờ tôi chỉ cần mở một thiết bị đầu cuối rồi sao chép vào:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "thay-a-url.com"
Bạn có thể nhận được một số lỗi chuỗi byte kỳ lạ, vì vậy đây là mã đầy đủ:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
Đây là một trong những công việc của tôi. trên mac OS X 10.10.4
grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'
Những cái ở trên sử dụng find sẽ thay đổi các tệp không chứa văn bản tìm kiếm (thêm một dòng mới ở cuối tệp), đó là dài dòng.
Nếu bạn đang sử dụng thiết bị đầu cuối zsh, bạn có thể sử dụng phép thuật ký tự đại diện:
sed -i "" "s/search/high-replace/g" *.txt
Tôi đã sử dụng định dạng này - nhưng ... tôi thấy tôi phải chạy nó ba lần trở lên để thực sự thay đổi mọi trường hợp mà tôi thấy vô cùng kỳ lạ. Chạy nó một lần sẽ thay đổi một số trong mỗi tệp nhưng không phải tất cả. Chạy chính xác cùng một chuỗi hai bốn lần sẽ bắt được tất cả các trường hợp.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
dấu chấm ở cuối, nếu không nó chỉ thay thế lần xuất hiện đầu tiên của thistext
một dòng. Vì vậy, regex của bạn nên làs/thistext/newtext/g
https://bitbucket.org/masonicboom/serp là một tiện ích đi (nghĩa là đa nền tảng), đã được thử nghiệm trên OSX, tìm kiếm đệ quy và thay thế văn bản trong các tệp trong một thư mục nhất định và xác nhận từng thay thế. Nó mới, vì vậy có thể có lỗi.
Cách sử dụng trông như:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
Tham khảo tại đây để biết thêm.
Lệnh trên OSX phải giống hệt như Unix trong giao diện người dùng đẹp.
-print0
thêm vào find
lá cờ và -0
đến xargs
cờ.
-exec sed -i s/this/that/g {} \+
thay vì -print
và xargs
xargs
có thể thấy "./jacobus" được phân cách bằng dấu cách sed
và sau đó với "R.txt" , không ai trong số đó tồn tại.
chỉ có thể nói $ PWD thay vì "."
apple.stackexchange.com
vì nó không đủ chung cho linux cũng như tất cả các nhà phát triển.