खोजें और निर्देशिका और उप निर्देशिकाओं में सेड के साथ बदलें


244

मैं अपनी साइट के रूट की सभी फाइलों में 'नारंगी' के साथ 'सेब' की सभी घटनाओं को खोजने और बदलने के लिए यह कमांड चलाता हूं:

find ./ -exec sed -i 's/apple/orange/g' {} \;

लेकिन यह उप निर्देशिकाओं के माध्यम से नहीं जाता है।

इस आदेश में क्या गलत है?

यहाँ के उत्पादन की कुछ पंक्तियाँ हैं find ./:

./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php

क्या आप find ./कुछ नमूना आउटपुट चला और पोस्ट कर सकते हैं ? और निर्देशिका strucuture कृपया। संपादित करें: धन्यवाद!
जैकब

Hm आपका पता सही है, मेरे लिए उप-काम करता है।
जैकब

1
आप कैसे जानते हैं कि यह उपनिर्देशिका को संसाधित नहीं करता है?
कारप्लेट

क्योंकि यह ये त्रुटियां देता है: sed: edit नहीं कर सकता ।/fpd: नहीं एक नियमित फ़ाइल sed: नहीं संपादित कर सकता है ।/fpd/font: नियमित रूप से फ़ाइल sed नहीं: संपादन नहीं कर सका ।/fpd/font/makefont: रेगुला नहीं
एचडी।

ओह ... मैं सेब के लिए grep और कुछ भी नहीं मिला। इन सभी को बदल दिया गया। ;) धन्यवाद । आपने मेरी आँखें खोलीं !!!
एच.डी.

जवाबों:


422

आपकी खोज इस तरह दिखनी चाहिए कि निर्देशिका नामों को sed में भेजने से बचें:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

19
इस काम sed -i 's/apple/orange/g'को sed -i '' 's/apple/orange/g'करने के लिए आपको बदलाव करना पड़ सकता है ।
पौलमेलनिकोव

7
-iएक तर्क लेता है: अस्थायी फ़ाइल को सहेजने के लिए उपयोग किया गया एक्सटेंशन। GNU sed में, ऐसा लगता है कि -iइसके और इसके तर्क के बीच कोई स्थान नहीं है, लेकिन BSD sed में ... इसलिए BSD -i '' 's/foo/bar/'GNU के बराबर है -i 's/foo/bar/
पाऊलेंनिकोव

20
वास्तव में जोड़ने से -eमैक ओएस पर काम नहीं होता है। touch a b c d eइसके बाद के संस्करण की कमान इस तरह एक निर्देशिका लिस्टिंग का उत्पादन करती है a a-e b b-e c c-e d d-e e e-e:।
पॉल्मेलनिकोव

6
Mac OS के लिए, यह उत्तर stackoverflow.com/questions/19242275/…RE error: illegal byte sequence
kakoma

3
मछली के खोल उपयोगकर्ताओं के लिए, खाली ब्रेसिज़ को उद्धृत करना सुनिश्चित करें '{}', क्योंकि मछली स्वचालित रूप से खाली ब्रेसिज़ का विस्तार करती है यदि उद्धृत नहीं किया गया है।
केविन चेरेप्सकी

84

बड़े s & r कार्यों के लिए grep और xargs का उपयोग करना बेहतर और तेज़ है, इसलिए, उदाहरण के लिए;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'

20
इस उत्तर के लिए धन्यवाद, यह बहुत मददगार था! एक Git भंडार में है, यह भी तेजी से उपयोग कर रहा हैgit grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues

4

यह मेरे लिए काम किया:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

मूल प्रश्न * .php फ़ाइलों तक ही सीमित नहीं है, वहाँ भी एक। ini एक
knocte

अयोग्य *.phpवास्तव में गलत है; आप अभी-अभी भाग्यशाली हैं कि इसे आरंभिक निर्देशिका में विस्तारित नहीं किया गया क्योंकि आपके पास वहाँ कोई मेल खाने वाली फाइल नहीं थी।
ट्रिपल जूल


1

चूंकि इसको पढ़ने वाले macOS लोग भी हैं (जैसा मैंने किया था), निम्न कोड ने मेरे लिए काम किया (10.14 पर)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

अन्य सभी उत्तर का उपयोग करते हुए -iऔर -emacOS पर काम नहीं करते हैं।

स्रोत


0

मुझे लगता है कि हम एक लाइन सरल कमांड के साथ ऐसा कर सकते हैं

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

इस पेज को देखें ।


-6

LinuxOS में:

sed -i 's/textSerch/textReplace/g' namefile

अगर "sed" काम नहीं करता है:

perl -i -pe 's/textSerch/textReplace/g' namefile

4
वह उप-निर्देशिकाओं में सभी फाइलों को ढूंढना चाहता है, जिसमें स्ट्रिंग और प्रतिस्थापित होते हैं, न केवल एक फाइल
phuclv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.