खोज और सेड (खोज और बदलें)


27

मैं अपने मैक पर निम्न कमांड का उपयोग कर रहा हूं:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;

और इसका कोई असर नहीं दिख रहा है।

मेरे पास .java में समाप्त होने वाली निर्देशिका में दो फाइलें हैं, जिसमें दोनों में foo टेक्स्ट है। क्या मैं कुछ भूल रहा हूँ?

संपादित करें: टिप्पणियों के अनुरोध के परिणाम

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .

2
क्या यह वही है जो आप चला रहे हैं? क्या होगा यदि आप -execऔर उसके बाद सब कुछ हटा दें ? क्या यह जावा फ़ाइलों के नाम प्रिंट करता है? (मुझे चिंता है कि आप ASCII उद्धरणों के बजाय स्मार्ट उद्धरणों का उपयोग कर रहे हैं।)
मिकेल

1
वास्तव में, जो इसे हल करता है, कम से कम मेरे लिए। दोनों दोहरे और एकल उद्धरण क्रमशः "और ', द्वारा प्रतिस्थापित किए जाने चाहिए ।
लेव लेवित्स्की

2
स्मार्ट (?) उद्धरण! .. :)
पीटर।

मैंने जो कुछ चिपकाया था, मैं वही चला रहा था। क्या कोई उत्तर पोस्ट कर सकता है?
अमीर अफगानी

1
अगली बार जब आप सवाल पूछ रहे हैं तो कृपया त्रुटि संदेश पोस्ट करें। यह सभी के लिए समय बचाएगा।
मिकेल

जवाबों:


34

सबसे पहले, सुनिश्चित करें कि आप शेल स्क्रिप्ट्स में नियमित रूप से ascii कोट्स "और '(ascii कोड 0x22और 0x27क्रमशः) का उपयोग कर रहे हैं , क्योंकि आपके पोस्ट में उदाहरण में गैर-मानक उद्धरण वर्ण हैं। यदि आप बारीकी से देखते हैं, तो वे कुछ अलग दिखते हैं। सबसे शायद यह एक अमीर पाठ दस्तावेज़ प्रारूप से कॉपी-पेस्ट त्रुटि है जैसे वर्ड, ऑरोटर, या यहां तक ​​कि एक ब्राउज़र विंडो।

चूंकि आप एक मैक पर हैं, तो आपके पास संभवतः फ्रीबीएसडी कार्यान्वयन है sed, जिस स्थिति में आपको इस तरह से कमांड लिखना होगा:

find . -name "*.java" -exec sed -i '' s/foo/bar/g {} +

(यहां प्रति फ़ाइल एक मंगलाचरण चलाने से बचने के +बजाय उपयोग करना )।\;sed

फ़्रीबीएसडी sedमें -iध्वज के कार्यान्वयन में एक तर्क की आवश्यकता होती है: बैकअप फ़ाइल का विस्तार। साथ उदाहरण के लिए -i .bakआदेश बैकअप होगा file1.txtके रूप में file1.txt.bakपहले मूल फ़ाइल में प्रतिस्थापन प्रदर्शन से पहले। रिक्त तर्क ''का उपयोग करने का अर्थ है बैकअप फ़ाइल का उपयोग न करना, जो आपको लगता है कि आप चाहते हैं।

GNU (या NetBSD, OpenBSD, busybox) कार्यान्वयन में यही बात होगी:

find . -name "*.java" -exec sed -i s/foo/bar/g {} +

आपकी टिप्पणियों के साथ मेरे उत्तर को बेहतर बनाने के लिए @ @hamat और @Mikel और @ pieter- नस्ल को धन्यवाद ।


घुंघराले ब्रेस क्या करते हैं?
ज़ेन हिचकॉक्स

3
@ZaneHitchcox घुंघराले ब्रेसिज़ मिलान फ़ाइल नाम के लिए प्लेसहोल्डर हैं
मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.