ในลินุกซ์เชลล์คำสั่งต่อไปนี้จะค้นหาซ้ำและแทนที่อินสแตนซ์ทั้งหมดของ 'this' ด้วย 'that' (ฉันไม่มีลินุกซ์เชลล์อยู่ข้างหน้าฉัน แต่ควรทำ)
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
คำสั่งที่คล้ายกันบน OSX จะมีลักษณะอย่างไร?
ในลินุกซ์เชลล์คำสั่งต่อไปนี้จะค้นหาซ้ำและแทนที่อินสแตนซ์ทั้งหมดของ 'this' ด้วย 'that' (ฉันไม่มีลินุกซ์เชลล์อยู่ข้างหน้าฉัน แต่ควรทำ)
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
คำสั่งที่คล้ายกันบน OSX จะมีลักษณะอย่างไร?
คำตอบ:
OS X ใช้เครื่องมือ BSD และ GNU ผสมกันดังนั้นควรตรวจสอบเอกสารให้ดีที่สุดเสมอ (แม้ว่าฉันจะมีมันที่less
ไม่เป็นไปตามหน้า OS X ก็ตาม):
sed ใช้อาร์กิวเมนต์หลัง-i
เป็นส่วนขยายสำหรับการสำรองข้อมูล ระบุสตริงว่าง ( -i ''
) สำหรับไม่มีการสำรองข้อมูล
สิ่งต่อไปนี้ควรทำ:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
-type f
คือการปฏิบัติที่ดีเพียง; sed จะบ่นถ้าคุณให้ไดเรกทอรีหรือมากกว่านั้น
-exec
เป็นที่ต้องการมากกว่าxargs
; คุณไม่จำเป็นต้องกังวล-print0
หรืออะไรเลย {} +
ที่หมายถึงการสิ้นสุดที่find
จะผนวกผลลัพธ์ทั้งหมดเป็นข้อโต้แย้งให้เป็นหนึ่งในตัวอย่างของคำสั่งที่เรียกว่าแทนของใหม่ใช้มันสำหรับแต่ละผล (ข้อยกเว้นประการหนึ่งคือเมื่อมีการละเมิดจำนวนอาร์กิวเมนต์บรรทัดคำสั่งสูงสุดที่ OS อนุญาตในกรณีfind
นั้นจะรันมากกว่าหนึ่งอินสแตนซ์)
%
อีกทางเลือกหนึ่งคือการทับขวาหนีคั่น:sed "s%localhost/site%blah/blah%"
sed "s/localhost\/site/blah\/blah/"
illegal byte sequence
ข้อผิดพลาดอีกไหม ถ้าเป็นเช่นนั้นลอง: LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
มันได้ผลสำหรับฉัน
/g
สำหรับสกุลเงินหลายสกุลเช่นLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
สำหรับ Mac วิธีการที่คล้ายกันมากขึ้นจะเป็นดังนี้:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
เป็นทางเลือกอื่นฉันใช้อันนี้บน Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
เครดิตไปที่: คำตอบของ Todd Cesere
บน Mac OSX 10.11.5 ใช้งานได้ดี:
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
ข้างต้นไม่มีผลกับ OSX
ดำเนินการดังต่อไปนี้:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
เวอร์ชันที่ใช้งานได้ทั้งบน Linux และ Mac OS X (โดยเพิ่ม-e
สวิตช์เป็น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
เมื่อใดก็ตามที่ฉันพิมพ์คำสั่งนี้ฉันมักจะพยายามแก้ไขหรือลืมแฟล็ก ฉันสร้าง Gist บน github จากคำตอบของ TaylanUB ที่ทำการแทนที่การค้นหาทั่วโลกจากไดเร็กทอรีปัจจุบัน นี่คือ Mac OSX โดยเฉพาะ
https://gist.github.com/nateflink/9056302
เป็นเรื่องดีเพราะตอนนี้ฉันเพิ่งเปิดเทอร์มินัลจากนั้นคัดลอก:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | ทุบตี -s "find-a-url.com" "replace-a-url.com"
คุณอาจได้รับข้อผิดพลาดของลำดับไบต์แปลก ๆ ดังนั้นนี่คือรหัสเต็ม:
#!/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
นี่คือสิ่งที่ใช้งานได้ของฉัน บน mac OS X 10.10.4
grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'
สิ่งที่กล่าวมาใช้การค้นหาจะเปลี่ยนไฟล์ที่ไม่มีข้อความค้นหา (เพิ่มบรรทัดใหม่ที่ท้ายไฟล์) ซึ่งเป็นแบบละเอียด
หากคุณใช้เทอร์มินัล zsh คุณสามารถใช้เวทมนตร์ตัวแทนได้:
sed -i "" "s/search/high-replace/g" *.txt
ฉันใช้รูปแบบนี้ - แต่ ... ฉันพบว่าฉันต้องเรียกใช้สามครั้งขึ้นไปเพื่อให้มันเปลี่ยนทุกอินสแตนซ์ซึ่งฉันพบว่าแปลกมาก การเรียกใช้ครั้งเดียวจะเปลี่ยนบางไฟล์ในแต่ละไฟล์ แต่ไม่ใช่ทั้งหมด การเรียกใช้สตริงเดียวกันสอง - สี่ครั้งจะจับอินสแตนซ์ทั้งหมด
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
ในตอนท้ายมิฉะนั้นจะแทนที่การเกิดครั้งแรกthistext
ในบรรทัดเท่านั้น ดังนั้น regex ของคุณควรเป็นs/thistext/newtext/g
https://bitbucket.org/masonicboom/serpเป็นยูทิลิตี้ go (เช่นข้ามแพลตฟอร์ม) ทดสอบบน OSX ซึ่งทำการค้นหาซ้ำและแทนที่ข้อความในไฟล์ภายในไดเร็กทอรีที่กำหนดและยืนยันการแทนที่แต่ละครั้ง เป็นเรื่องใหม่ดังนั้นอาจมีปัญหา
ลักษณะการใช้งาน:
$ 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'
อ้างอิงที่นี่สำหรับข้อมูลเพิ่มเติม
คำสั่งบน OSX ควรเหมือนกับ Unix ทุกประการภายใต้ UI ที่สวยงาม
-print0
เพิ่มให้กับfind
ธงและ-0
ไปที่xargs
ธง
-exec sed -i s/this/that/g {} \+
แทน-print
และ xargs ได้
xargs
อาจเห็น "./jacobus" ที่คั่นด้วยช่องว่างเป็นไฟล์ที่จะส่งผ่านไปยังsed
และตามด้วย "R.txt" ซึ่งไม่มีอยู่จริง
สามารถพูดว่า $ PWD แทน "."
apple.stackexchange.com
เนื่องจากมันไม่ได้เป็นแบบทั่วไปเพียงพอสำหรับ linux หรือ devs ทั้งหมด