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ę

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.

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

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.

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

Kod: Zaznacz cały

cat -vet edytor.sh
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:

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$

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

Kod: Zaznacz cały

sh edytor.sh
spróbuj:

Kod: Zaznacz cały

./edytor.sh

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