2013-03-05 4 views
7

मैं txtfiles का एक बैच (क्योंकि वहाँ हमेशा सामने और इसके पीछे एक अंतरिक्ष यह एक शब्द के रूप में माना जा सकता है में सभी लाइनों के लिए :: साथ एक स्ट्रिंग ::: को बदलने के लिए कोशिश कर रहा हूँसभी फ़ाइलों में एक स्ट्रिंग बदलें - यूनिक्स

मैं नीचे की तरह अजगर के साथ यह कर सकते हैं, लेकिन वहाँ एक कम 'ओवर-मार'/जटिल यूनिक्स टर्मिनल के माध्यम से ऐसा करने का तरीका है? (कई पाइप की अनुमति दी)

indir = "./td/" 
outdir = './od/' 
for infile in glob.glob(os.path.join(indir,"*")): 
    _,FILENAME = os.path.split() 
    for l in codecs.open(infile,'r','utf8').readlines(): 
    l = l.replace(":::","::").strip() 
    outfile = codecs.open(os.path.join(outdir,FILENAME),'a+','utf8') 
    print>>outfile, l 

तो मैं सभी के लिए कदम od से td mv ./od/* ./td/*

से फ़ाइलें

उत्तर

18
find . -name "./td/*.c" -exec sed -i "s/:::/::/g" '{}' \; 

बिल्कुल od/ के लिए कोई ज़रूरत नहीं।

संपादित करें:

एक थोड़ा सरल भिन्नता:

ls td/*.c | xargs sed -i '' "s/:::/::/g" 
+1

सरल और भी बहुत कुछ कुशल रूप में अच्छी तरह। यदि आप अंत में '\' 'के बजाय' + 'का उपयोग करते हैं, तो आप' find' संस्करण को उतना ही कुशल बना सकते हैं। फ़ाइल नामों को संभालने के लिए ls का उपयोग करने के लिए – Idelic

+0

-1। मैं स्पष्ट "सरल" समाधान 'sed -i ... td/*। C' (अनुपलब्ध होने पर जोड़ा गया ग्लोबस्टार के साथ) को खोने के लिए एक और जोड़ दूंगा। और दूसरा नाम खोजने-नाम विकल्प में निर्देशिका नामों का उपयोग करने के लिए (देखें: http://linux.about.com/od/commands/l/blcmdl1_find.htm) ... इसे 4 वोट कैसे प्राप्त हुए? – Sorin

+0

@ सोरीन: मैं मानता हूं कि मैं स्रोत फ़ाइल नामों में विशेष पात्रों के लिए खाता नहीं लेता हूं (यह पता लगाने के लिए कि जो लोग उनका उपयोग करते हैं उन्हें वे क्या प्राप्त करते हैं), लेकिन इसके अलावा मुझे समस्या दिखाई नहीं देती है। आपके 'td/*। C' सुझाव के लिए कुडोस हालांकि, मुझे नहीं पता था कि यह काम करेगा; अगर मैंने इसे अधिक सौजन्य से सुझाव दिया था तो मैंने इसे अपने उत्तर (एट्रिब्यूशन के साथ) में जोड़ा होगा। – Beta

3

sed के साथ प्रत्येक फ़ाइल को संसाधित करने के लिए एक साधारण पाश पर्याप्त होना चाहिए।

for inp in ./td/*; do 
    fname=${inp##*/} 
    sed 's/:::/::/g' "$inp" > ./od/"$fname" 
done 
संबंधित मुद्दे