Zmiana warto

Potrzebujesz pomocy z C, C++, perl, python, itp.
lolek
Posty: 9
Rejestracja: 22 maja 2011, 23:48

Zmiana wartości w plikach tekstowych poleceniem

Post 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ę

Kod: Zaznacz cały

punkty=ilość
(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.
balrog84
Posty: 4
Rejestracja: 10 maja 2012, 11:54

Post 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.:

Kod: Zaznacz cały

chmod +x edytor.sh
A następnie uruchamiasz poleceniem:

Kod: Zaznacz cały

sh edytor.sh
lub w trybie graficznym.
Punkty w przykładzie: 999 - zmień wg swoich potrzeb.
lolek
Posty: 9
Rejestracja: 22 maja 2011, 23:48

Post 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$
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post 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ś:

Kod: Zaznacz cały

cat -vet edytor.sh
Nie kopiujesz tego czasem pod Windowsem i wklejasz do linuksa?
lolek
Posty: 9
Rejestracja: 22 maja 2011, 23:48

Post 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:

Kod: Zaznacz cały

cat: a: No such file or directory
Dodatkowo, w katalogu tworzy się plik tmp.txt
kodama pisze:Sprawdź takie coś:

Kod: Zaznacz cały

cat -vet edytor.sh

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$
balrog84
Posty: 4
Rejestracja: 10 maja 2012, 11:54

Post 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:

Kod: Zaznacz cały

sh edytor.sh
spróbuj:

Kod: Zaznacz cały

./edytor.sh
lolek
Posty: 9
Rejestracja: 22 maja 2011, 23:48

Post 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ą?
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post 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.
balrog84
Posty: 4
Rejestracja: 10 maja 2012, 11:54

Post 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'
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post autor: kodama »

Kolega powyżej ma oczywiście całkowitą rację - niefortunnie wstawiłem tam te gwiazdki, mogły być mylące.
ODPOWIEDZ