2013-03-05 14 views
7

próbuję zastąpić ciąg ::: z :: dla wszystkich linii w partii txtfiles (może to być traktowane jako słowa, ponieważ nie zawsze jest przestrzeń przed i za nimzastąpić ciąg w wszystkich plików - Unix

.

mogę zrobić z python jak poniżej, ale jest tam mniej „over-kill”/zawiły sposób to zrobić za pośrednictwem terminalu unix? (Wiele rur dozwolone)

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 

potem przenieść wszystko pliki od od do td mv ./od/* ./td/*

Odpowiedz

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

Nie potrzeba od/ w ogóle.

EDIT:

Nieco prostsza odmiana:

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

prostsze i bardziej wydajne, jak również. Możesz sprawić, że wersja 'find' będzie równie wydajna, jeśli użyjesz' + 'zamiast' \; 'na końcu. – Idelic

+0

-1 dla używania ls do obsługi nazw plików. Dodałbym jeszcze jeden za brak oczywistego "prostszego" rozwiązania 'sed -i ... td/*. C' (z dodaną gwiazdą globalną w razie potrzeby). I jeszcze jeden do używania nazw katalogów w opcji find -name (zobacz: http://linux.about.com/od/commands/l/blcmdl1_find.htm) ... Jak to się stało, że dostał 4 głosy? – Sorin

+0

@Sorin: Przyznaję, że nie uwzględniam znaków specjalnych w nazwach plików źródłowych (myślę, że ci, którzy ich używają, zasługują na to, co dostają), ale poza tym nie widzę problemu. Kudos za twoją sugestię 'td/*. C' jednak nie wiedziałem, że to zadziała; Dodałbym to do mojej odpowiedzi (z atrybucją), gdyby zostało to zasugerowane z większą uprzejmością. – Beta

3

Wystarczy pętla do przetworzenia każdego pliku z sed powinna wystarczyć.

for inp in ./td/*; do 
    fname=${inp##*/} 
    sed 's/:::/::/g' "$inp" > ./od/"$fname" 
done 
Powiązane problemy