जवाबों:
निम्नलिखित का प्रयास करें:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
यदि आप चार स्थान चाहते हैं, तो प्रयास करें:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
प्रति पंक्ति केवल एक टैब से अधिक प्रतिस्थापित करना होगा ।
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (" +
" के बजाय "" \;
") है, अगर find
संस्करण इसका समर्थन करता है (और मैं व्यक्तिगत रूप से किसी भी संस्करण से नहीं मिला है जो नहीं करता है, लेकिन यह एक POSIX मानक नहीं है , इसलिए मुझे लगता है कि यह कुछ प्रणालियों पर हो सकता है। " -exec command {} +
" मैनुअल में देखें )। sed
हर फ़ाइल के लिए एक इंस्टेंस को लॉन्च करने के बजाय , यह सिस्टम सूची का समर्थन करता है ( getconf ARG_MAX
जैसे मेरे सिस्टम पर = 2097152) के रूप में कई फ़ाइल नाम तर्कों के साथ एक तर्क सूची का निर्माण करेगा xargs
, और इस तरह बहुत कम sed
प्रक्रियाओं को लॉन्च करेगा ।
sed
को नहीं समझता है \t
। आप इसे शाब्दिक टैब वर्ण के साथ बदल सकते हैं, जिसे आप शेल में दर्ज कर सकते हैं [Ctrl]+V, [Tab]
।
ऐसा करने के बहुत सारे तरीके हैं। ऐसा करते समय पैर में अपने आप को गोली मारने के बहुत सारे तरीके हैं यदि आप सावधान नहीं हैं या यदि आप लिनक्स में नए हैं जैसा कि आप प्रतीत होते हैं। यह मानते हुए कि आप फ़ाइलों की एक सूची बना सकते हैं, जिसे आप कनवर्ट करना चाहते हैं, या तो find
किसी संपादक की तरह या मैन्युअल रूप से कुछ का उपयोग करके , उस सूची को निम्नलिखित में पाइप करें।
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
एक तरीका है कि आप अपने आप को पैर में गोली मार सकते हैं इसके साथ एक टाइपो बनाना है ताकि आप अपने द्वारा निर्दिष्ट सभी फ़ाइल नामों के लिए एक खाली फ़ाइल को हवा दें, जिससे आपकी सभी फ़ाइलों की सामग्री को हटा दिया जाए। इसलिए सावधान रहें और जो कुछ भी आप फ़ाइलों का एक छोटा सा सेट पर पहले करें, उसका परीक्षण करें।
mv
की सफलता पर सशर्त बनाएं expand
:expand ... && mv ...
expand -t 4
टैब को 4 स्थानों तक विस्तारित करना न भूलें । साथ ही, यह विधि अनुगामी न्यूलाइन्स बना सकती है। लेकिन अन्यथा यह काम करता है।
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
प्रत्येक इनपुट लाइन के लिए एक टेम्प्लेट वैरिएबल फू बनाता है, जिससे आप एक से अधिक बार इनपुट का उल्लेख कर सकते हैं।
-print0
और -0
दोनों आदेशों को स्पेस के बजाय लाइन विभाजक के रूप में \ 0 का उपयोग करने के लिए कहें, इसलिए यह कमांड रिक्त स्थान के साथ पथों के लिए काम करता है।
यह बेहतर है:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
क्योंकि अगर कुछ और उस फ़ाइल का उपयोग कर रहा है, तो यह इसे गड़बड़ कर देगा। जैसे अगर दो उपयोगकर्ता एक ही समय में इसका उपयोग करना चाहते थे।
मैंने इस समस्या को निम्नलिखित आवश्यकताओं को ध्यान में रखते हुए एक शॉट दिया:
अंतिम आवश्यकता को पूरा करना सबसे कठिन था क्योंकि "विस्तार" फाइलों को जगह में संशोधित करने की अनुमति नहीं देता है।
मैं निम्नलिखित समाधान के साथ आया:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
यहाँ कुछ स्पष्टीकरण है:
expand
, मैं मानता हूं कि वह पाठ के संरेखण को संरक्षित करना चाहता है।