2013-03-05 36 views
7

Ben TXTFiles Bir grup (hem önünde hem de arkasında bir boşluk her zaman vardır çünkü bir kelime olarak kabul edilebilir tüm hatlar için :: bir dize ::: değiştirmeye çalışıyorumtüm dosyaların bir dize değiştirin - Unix

.

aşağıda gibi piton ile bunu yapabilir, ama unix terminal vasıtasıyla bunu yapmanın daha az 'aşırı öldürme'/dolambaçlı yol var? (Birçok borular izin)

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 

Sonra ben hiç hareket od'dan td'ye dosyalar mv ./od/* ./td/*

cevap

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

hiç od/ gerek yok.

DÜZENLEME:

Biraz daha basit varyasyonu:

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

basit ve çok daha verimli. Sonunda '\' yerine '+' seçeneğini kullanırsanız, 'find' sürümünü daha verimli hale getirebilirsiniz. Dosya adlarını işlemek için ls kullanmak üzere – Idelic

+0

-1. Açık olan “daha ​​basit” çözümü (sed - t ... td/*. C) (gerekirse bir globstar eklenir) eksik olanı için bir tane daha eklerim. Ve find -name seçeneğinde dizin isimlerini kullanmak için bir tane daha (bakınız: http://linux.about.com/od/commands/l/blcmdl1_find.htm) ... Bu nasıl 4 oy aldı? – Sorin

+0

@Sorin: Kaynak dosya adlarında özel karakterler bulundurmadığımı kabul ediyorum (bunları kullananların ne aldıklarını hakettiklerini anladım), fakat bundan başka ben de problemi göremiyorum. Td/*. C 'öneriniz için Kudos olsa da, işe yarayacağını bilmiyordum; Daha fazla nezaketle önerilmiş olsaydı, cevabımı (atıf ile) ekledim. – Beta

3

Her dosyayı sed ile işlemek için basit bir döngü yeterli olmalıdır.

for inp in ./td/*; do 
    fname=${inp##*/} 
    sed 's/:::/::/g' "$inp" > ./od/"$fname" 
done 
İlgili konular