टैब को कई फाइलों में रिक्त स्थान में बदलना


11

मेरे पास बहुत सारी फाइलें हैं जिनमें टैब्स भरे हुए हैं, और मैं उन सभी को स्पेस में बदलना चाहता हूं। मुझे expandकमांड के बारे में पता है , लेकिन दुर्भाग्य से मुझे इसका उपयोग करके हर एक फाइल को टाइप करना होगा। क्या लिनक्स पर ऐसा करने का कोई आसान तरीका है?

जवाबों:


12

निम्नलिखित का प्रयास करें:

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

यदि आप चार स्थान चाहते हैं, तो प्रयास करें:

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

जो कि प्रत्येक टैब को सिंगल स्पेस से बदल देगा। चूंकि व्यक्ति ने उल्लेख किया है expand, मैं मानता हूं कि वह पाठ के संरेखण को संरक्षित करना चाहता है।
गैरीजोन

आपको 's/\t/ /g'प्रति पंक्ति केवल एक टैब से अधिक प्रतिस्थापित करना होगा ।
डैनियल एंडरसन

1
अगर कई फाइलें हैं तो एक पर्याप्त स्पीडअप " find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" (" +" के बजाय "" \;") है, अगर findसंस्करण इसका समर्थन करता है (और मैं व्यक्तिगत रूप से किसी भी संस्करण से नहीं मिला है जो नहीं करता है, लेकिन यह एक POSIX मानक नहीं है , इसलिए मुझे लगता है कि यह कुछ प्रणालियों पर हो सकता है। " -exec command {} +" मैनुअल में देखें )। sedहर फ़ाइल के लिए एक इंस्टेंस को लॉन्च करने के बजाय , यह सिस्टम सूची का समर्थन करता है ( getconf ARG_MAXजैसे मेरे सिस्टम पर = 2097152) के रूप में कई फ़ाइल नाम तर्कों के साथ एक तर्क सूची का निर्माण करेगा xargs, और इस तरह बहुत कम sedप्रक्रियाओं को लॉन्च करेगा ।
डैनियल एंडरसन

6
किसी भी मैक उपयोगकर्ताओं को जो यह पाते हैं पर ध्यान दें: OS X का संस्करण टैब एस्केप अनुक्रम sedको नहीं समझता है \t। आप इसे शाब्दिक टैब वर्ण के साथ बदल सकते हैं, जिसे आप शेल में दर्ज कर सकते हैं [Ctrl]+V, [Tab]
जेरेमी बैंक्स

expandशायद इससे बेहतर है sed, जैसा कि इसमें बताया गया है: stackoverflow.com/a/11094620/131824
डेविड वेनराउब

6

ऐसा करने के बहुत सारे तरीके हैं। ऐसा करते समय पैर में अपने आप को गोली मारने के बहुत सारे तरीके हैं यदि आप सावधान नहीं हैं या यदि आप लिनक्स में नए हैं जैसा कि आप प्रतीत होते हैं। यह मानते हुए कि आप फ़ाइलों की एक सूची बना सकते हैं, जिसे आप कनवर्ट करना चाहते हैं, या तो findकिसी संपादक की तरह या मैन्युअल रूप से कुछ का उपयोग करके , उस सूची को निम्नलिखित में पाइप करें।

while read file
do
   expand "$file" > /tmp/expandtmp
   mv /tmp/expandtmp "$file"
done

एक तरीका है कि आप अपने आप को पैर में गोली मार सकते हैं इसके साथ एक टाइपो बनाना है ताकि आप अपने द्वारा निर्दिष्ट सभी फ़ाइल नामों के लिए एक खाली फ़ाइल को हवा दें, जिससे आपकी सभी फ़ाइलों की सामग्री को हटा दिया जाए। इसलिए सावधान रहें और जो कुछ भी आप फ़ाइलों का एक छोटा सा सेट पर पहले करें, उसका परीक्षण करें।


3
mvकी सफलता पर सशर्त बनाएं expand:expand ... && mv ...
आगे की सूचना तक रोकें।

expand -t 4टैब को 4 स्थानों तक विस्तारित करना न भूलें । साथ ही, यह विधि अनुगामी न्यूलाइन्स बना सकती है। लेकिन अन्यथा यह काम करता है।
एमजॉल्ड

3
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo

-I foo प्रत्येक इनपुट लाइन के लिए एक टेम्प्लेट वैरिएबल फू बनाता है, जिससे आप एक से अधिक बार इनपुट का उल्लेख कर सकते हैं।

-print0और -0दोनों आदेशों को स्पेस के बजाय लाइन विभाजक के रूप में \ 0 का उपयोग करने के लिए कहें, इसलिए यह कमांड रिक्त स्थान के साथ पथों के लिए काम करता है।


1
find -name \*.js -exec bash -c 'expand -t 4 "$0" | tee "$0"' {} \;

विपक्ष:
पाइप बफर आकार ( 64KB ) की तुलना में बड़ी फ़ाइलों को छोटा किया जाता है

पेशेवरों: पाइप बफर आकार से बड़ी
कोई अस्थायी फाइलें नहीं
मिलती हैं


0

यह बेहतर है:

find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;

3
यह बेहतर क्यों है? यह उपयोग करने के लिए एक महान विचार नहीं है /tmp/eक्योंकि अगर कुछ और उस फ़ाइल का उपयोग कर रहा है, तो यह इसे गड़बड़ कर देगा। जैसे अगर दो उपयोगकर्ता एक ही समय में इसका उपयोग करना चाहते थे।
केविन पैंको

0

मैंने इस समस्या को निम्नलिखित आवश्यकताओं को ध्यान में रखते हुए एक शॉट दिया:

  • केवल .cpp या .json फ़ाइल के लिए प्रक्रिया करने के लिए, उनके नाम के आधार पर फ़ाइलों को फ़िल्टर करें
  • समानांतर प्रसंस्करण का समर्थन करें। मामले में कई फाइलें हैं, यह एक बड़ी गति प्रदान कर सकता है
  • आसान उपयोग के लिए समाधान एक पंक्ति में फिट होना चाहिए

अंतिम आवश्यकता को पूरा करना सबसे कठिन था क्योंकि "विस्तार" फाइलों को जगह में संशोधित करने की अनुमति नहीं देता है।

मैं निम्नलिखित समाधान के साथ आया:

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'

यहाँ कुछ स्पष्टीकरण है:

  • "खोज" प्रक्रिया के लिए फ़ाइलें ढूंढता है। "-regextype egrep" उन्हें उनके नाम और "egrep" प्रारूप में एक नियमित अभिव्यक्ति के आधार पर फ़िल्टर करने की अनुमति देता है
  • "-type f" पैरामीटर यह सुनिश्चित करता है कि हम केवल नियमित फ़ाइलों से मेल खाएँगे, न कि उदाहरण निर्देशिकाओं या किसी विशेष चीज़ के लिए
  • "-regexp" पैरामीटर नियमित अभिव्यक्ति ही है, जो इस मामले में किसी भी फ़ाइल से मेल खाता है। .c, .cpp, .h या .hpp (पूरे नाम से मेल खाना है, इसलिए "file.c2" नहीं होगा। , जो हम चाहते हैं)
  • "-प्रिंट0" प्रत्येक पथ के अंत में वर्ण 0 के साथ मानक मानक पर फ़ाइल पथ मुद्रित करने के लिए "खोज" का निर्देश देता है। एक साथ "xargs" के लिए विकल्प "-0" के साथ, यह एक उपकरण से दूसरे में रिटर्न कैरिज वाले नामों को पारित करने की अनुमति देता है (भले ही यह बहुत दुर्लभ स्थिति हो ...)
  • xargs प्रत्येक पथ ("-n 1") के लिए एक नई प्रक्रिया शुरू करता है, लेकिन समानांतर ("P-10") में 10 प्रक्रियाओं के रूप में चल सकता है
  • xargs प्रत्येक फ़ाइल पथ को कमांड में उर्फ ​​"FILE" का उपयोग करता है, जो एक बैश स्क्रिप्ट है
  • बैश स्क्रिप्ट कॉल "विस्तार" करती है और परिणाम को एक अस्थायी फ़ाइल में सहेजती है, जिसमें नामों में वर्तमान प्रक्रिया आईडी ($ $) शामिल है, ताकि किसी दिए गए फ़ाइल में समानांतर चलने वाली सभी प्रक्रियाएं अलग-अलग अस्थायी फ़ाइलों का उपयोग करें
  • संपूर्ण कमांड पैटर्न का उपयोग करता है (कमांड 1 && कमांड 2 और& कमांड 3) ताकि कोई भी उपकेंद्र त्रुटि होने पर प्रक्रिया बंद हो जाए
  • यदि पिछली "&&" श्रृंखला से कोई त्रुटि है, तो bash स्क्रिप्ट एक निकास कोड 255 लौटाएगा जिससे xarps तुरंत बंद हो जाएगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.