Strona 1 z 1
Zmiana wartości w plikach tekstowych poleceniem
: 13 maja 2012, 19:15
autor: lolek
Cześć.
Chciałbym poprzez jedno polecenie zmienić wartości w wielu plikach, powiedzmy, że mam np. 1000 plików z rozszerzeniem .txt (lub jakimś innym, to tylko przykład) o różnych nazwach w jednym katalogu. W pliku mam np. linijkę
(gdzie ilość to np. 2561, w każdym pliku ta wartość jest inna).
Chciałbym poprzez polecenie określając daną linijkę (np. punkty) ustawić wszystkim plikom taką samą wartość w tejże linijce, da się tak zrobić, prawda? Tylko jak? Byłbym wdzięczny za pomoc.
: 14 maja 2012, 12:45
autor: balrog84
Tak na szybko, tworzysz sobie plik ze skryptem (np. edytor.sh) o treści:
Kod: Zaznacz cały
#! /bin/bash
for file in *.txt; do
cat $file | sed -e 's/punkty=.*/punkty=999/g' > tmp.txt
mv -f tmp.txt $file
done
Umieszczasz skrypt w katalogu z plikami do edycji, nadajesz uprawnienia do uruchamiania np.:
A następnie uruchamiasz poleceniem:
lub w trybie graficznym.
Punkty w przykładzie: 999 - zmień wg swoich potrzeb.
: 15 maja 2012, 15:34
autor: lolek
O coś takiego mi chodziło. Dziękuję. Nie koniecznie z potrzebą tworzenia pliku, ale to nie problem, tylko pytanie, plik ten znajdować się musi w katalogu z plikami do edycji? Tak właśnie mam, ustawiłem uprawnienia i nie działa.
Kod: Zaznacz cały
host:~/konta$ sh edytor.sh
: command not found
'dytor.sh: line 3: syntax error near unexpected token `do
'dytor.sh: line 3: `for file in *.txt; do
host:~/konta$
: 15 maja 2012, 20:27
autor: kodama
Na pewno przekopiowałeś dokładnie treść tego skryptu od balroga? Bo ja tak zrobiłem, stworzyłem sobie losowe pliki txt i nie ma problemu. Sprawdź takie coś:
Nie kopiujesz tego czasem pod Windowsem i wklejasz do linuksa?
: 15 maja 2012, 23:42
autor: lolek
kodama pisze:Na pewno przekopiowałeś dokładnie treść tego skryptu od balroga?
Tak.
kodama pisze:Nie kopiujesz tego czasem pod Windowsem i wklejasz do linuksa?
Nie pomyślałem, że może to mieć jakieś znaczenie, ale po przeczytaniu Twojego posta utworzyłem i edytowałem plik edytor.sh na Linuksie, z kolei teraz przy uruchomieniu wyświetla się tylko to:
Dodatkowo, w katalogu tworzy się plik tmp.txt
kodama pisze:Sprawdź takie coś:
Kod: Zaznacz cały
host:~/konta$ cat -vet edytor.sh
#! /bin/bash$
$
for file in *.txt; do$
cat $file | sed -e 's/punkty=.*/punkty=999/g' > tmp.txt$
mv -f tmp.txt $file$
done$
: 16 maja 2012, 11:53
autor: balrog84
Plik ze skryptem o nazwie edytor.sh wrzucasz do katalogu z plikami *.txt - upewnij się co do uprawnień (że może być wykonywany). Przejdź w terminalu do tego katalogu.
Zamiast:
spróbuj:
: 16 maja 2012, 23:11
autor: lolek
Przepraszam, jednak działa, nie wiem czemu wcześniej nie chciało. Stworzyłem od nowa plik, nadałem uprawnienia i działa. Wcześniej użyłem innego polecenia do utworzenia pliku niż teraz, może to miało jakieś znaczenie lub pomyliłem się z uprawnieniami. W każdym bądź radzie działa i dziękuję za udzielaną mi pomoc.
Mam tylko jeszcze ostatnie pytanie, jak przerobić ten skrypt tak, by można było edytować parę linijek z pliku, a nie tylko jedną?
: 17 maja 2012, 08:52
autor: kodama
Polecenie sed możesz użyć np tak:
Kod: Zaznacz cały
's/*coś do zmiany*/*na takie coś*/g;s/*następne coś do zmiany*/*na kolejne coś*/g;s/......'
Piszesz ciągiem, kolejne 'fragmenty' oddzielasz średnikiem.
: 17 maja 2012, 11:08
autor: balrog84
Tak jak napisał kodama, tylko nie zasugeruj się tymi gwiazdkami, zwróć uwagę jak jest w skrypcie - te 2 znaki .* oznaczają dowolny ciąg. Składnia sed dla np. podwójnej zmiany (punkty=XX na punkty=16 + pozycja=XX na pozycja=4) wyglądałaby tak:
Kod: Zaznacz cały
sed -e 's/punkty=.*/punkty=16/g;s/pozycja=.*/pozycja=4/g'
: 17 maja 2012, 17:26
autor: kodama
Kolega powyżej ma oczywiście całkowitą rację - niefortunnie wstawiłem tam te gwiazdki, mogły być mylące.