जवाबों:
ओएस एक्स बीएसडी और जीएनयू उपकरणों के मिश्रण का उपयोग करता है, इसलिए हमेशा सर्वश्रेष्ठ प्रलेखन की जांच करें (हालांकि मेरे पास ऐसा lessथा जो ओएस एक्स मैनपेज के अनुरूप नहीं था):
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 {} +
मैक के लिए, अधिक समान दृष्टिकोण यह होगा:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
वैकल्पिक समाधान के रूप में, मैं इसे मैक ओएसएक्स 10.7.5 पर उपयोग कर रहा हूं
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
इसका श्रेय जाता है: टोड सेसर के जवाब
OSX पर उपरोक्त कार्य में से कोई भी नहीं।
निम्न कार्य करें:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
एक संस्करण जो लिनक्स और मैक ओएस एक्स दोनों पर काम करता है ( -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
जब भी मैं इस कमांड को टाइप करता हूं तो मुझे हमेशा यह नली लगती है, या झंडा भूल जाते हैं। मैंने तयलूब के जवाब के आधार पर जीथब पर एक जिस्ट बनाया जो वर्तमान निर्देशिका से एक वैश्विक खोज को प्रतिस्थापित करता है। यह मैक OSX विशिष्ट है।
https://gist.github.com/nateflink/9056302
यह अच्छा है क्योंकि अब मैं सिर्फ एक टर्मिनल खोलता हूँ, तो इसमें कॉपी करें:
कर्ल-एस https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "प्रतिस्थापित-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
मैंने इस प्रारूप का उपयोग किया - लेकिन ... मैंने पाया कि मुझे इसे वास्तव में हर उदाहरण को बदलने के लिए इसे तीन या अधिक बार चलाना था जो मुझे बहुत अजीब लगा। एक बार इसे चलाने से प्रत्येक फ़ाइल में कुछ बदल जाएगा लेकिन सभी नहीं। दो-चार बार एक ही स्ट्रिंग चलाने से सभी उदाहरणों को पकड़ा जा सकता है।
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
gको अंत में जरूरत है , अन्यथा यह केवल thistextएक लाइन में पहली घटना को प्रतिस्थापित करता है । तो आपका रेगेक्स होना चाहिएs/thistext/newtext/g
https://bitbucket.org/masonicboom/serp 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 पर कमांड बिल्कुल वैसा ही होना चाहिए जैसा कि सुंदर UI के तहत यूनिक्स है।
-print0करने के लिए जोड़ा findझंडे और -0करने के लिए xargsझंडे।
-exec sed -i s/this/that/g {} \+के बजाय -printऔर xargs
xargsहो सकता है कि अंतरिक्ष-सीमांकित "./jacobus" को पास करने के लिए एक फ़ाइल के रूप में देखें sed, और फिर "R.txt" के साथ। , जिनमें से कोई भी मौजूद नहीं है।
"के बजाय $ PWD कह सकते हैं।"
apple.stackexchange.comइसे ले जाया जाना चाहिए क्योंकि यह न तो लिनक्स के लिए पर्याप्त है और न ही सभी देवों के लिए।