Nowe posty

Autor Wątek: Zmiana części pliku  (Przeczytany 3354 razy)

rkaminski

  • Gość
Zmiana części pliku
« dnia: 2009-03-28, 18:48:01 »
Witam,

Mam następujący problem. Mam dość dużo plików tekstowych o bardzo podobnej treści i właściwie w każdym muszę zmienić tylko jedną lub dwie literki. Np. mam w linijce w pliku wyrażenie

O /TZP/O.2s

i chciałbym to zmienić na

O /TZ2P+/O.2s

Zmiana niewielka, ale jak takich plików jest ze 60 to jest to troszkę męczące. Myślałem aby napisać pętlę w skrypcie która zrobi to automatycznie, znaczy się podając skryptowi tylko nazwy plików. Szukałem i nie wiem jaka komenda może mi w tym pomóc (w tym zamienianiu). Samą pętlę wiem jak napisać. Chyba, że jest też prostszy sposób.

Z góry dzięki i pozdrawiam, Radek

arctgx

  • Gość
Zmiana części pliku
« Odpowiedź #1 dnia: 2009-03-28, 20:00:25 »
sed -i 's=/TZP/=/TZ2P+/=g' *
lub precyzyjniej dopasowane wyrażenie czy zbiór plików. Możesz też find użyć do wyboru zbioru plików.

Ed. Przed edycją zrób lepiej kopię zapasową. Zobacz też man sed oraz przykłady w sieci z tym narzędziem.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Zmiana części pliku
« Odpowiedź #2 dnia: 2009-03-28, 20:12:35 »
Możesz posłużyć się wyrażeniami regularnymi:
#!/bin/bash
mkdir -p nowe
for plik in *.txt; do
    echo -n "" > "nowe/${plik}"
    while read line; do
        regexp="______________"
        if [[ "$line" =~ $regexp ]]; then
            line="______________"
        fi
        echo "$line" >> "nowe/${plik}"
    done < "$plik"
done
regexp wypełniasz odpowiednim wyrażeniem regularnym, a niżej odtwarzasz line przy użyciu tablicy BASH_REMATCH odpowiadającej wziętym w nawiasy ciągom znaków.

Na przykład takie wartości wstawią "+" pomiędzy ciąg liter i cyfr:
regexp="^([a-zA-Z]+)([0-9]+)$"
line="${BASH_REMATCH[1]}+${BASH_REMATCH[2]}"
Napisz dokładniej, jak wyglądają te pliki i co chcesz uzyskać.

arctgx

  • Gość
Zmiana części pliku
« Odpowiedź #3 dnia: 2009-03-28, 20:46:56 »
Nie wiem czy to praktyczne, kiedy chcemy zmienić tylko kawałek linijki, ale to ciekawy przykład pokazujący że czasem można obyć się bez zewnętrznych narzędzi typu sed. Przy okazji, zamiast echo -n "" dałbym po prostu dwukropek.

rkaminski

  • Gość
Zmiana części pliku
« Odpowiedź #4 dnia: 2009-03-28, 22:51:21 »
OK, ten sed działa bardzo fajnie, ale znowu przejrzałem net i jakoś w ogólnie mogę znaleźć. Mianowicie uściślę, mam w pliku np. coś takiego:

  Co  $ADFRESOURCES/QZ4P/Co
  O   $ADFRESOURCES/QZ4P/O

i chcę to zmienić na

  Co  $ADFRESOURCES/QZ4P/Co
  O   $ADFRESOURCES/TZ2P+/O

Jak wpisać to całe wyrażenie? Jak podaję to wyrażenie na początku ale razem ze znakami / to nie działa...

arctgx

  • Gość
Zmiana części pliku
« Odpowiedź #5 dnia: 2009-03-29, 01:41:48 »
's=[b]\\([/b]O $ADFRESOURCES/[b]\\)[/b]QZ4P[b]\\([/b]/O[b]\\)[/b]=[b]\\1[/b]TZ2P+[b]\\2[/b]=g'
Wyrażenia \\1 i \\2 zastępują odpowiednio zawartość pierwszego i drugiego nawiasu (zamaskowanego odwrotnym ukośnikiem).

A może chodziło Ci tylko o sytuację, w której zmieniamy postać nie każdej linijki z 'O', a tylko gdy występuje bezpośrednio poniżej tej z 'Co'?