Strona 1 z 1

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 18 Sty 2013, 22:27
przez gordom
Witam,
Szukam sposobu (pod Windowsem lub Linuxem), który umożliwi mi na:

wyszukanie konkretnej frazy we wszystkich plikach tekstowych w danym katalogu z zastosowaniem wyrażenia regularnego,
oraz podmianę tej frazy innym ciągiem, ale uwaga, osobnym i unikalnym dla każdego z plików.

Myślałem, że zrobię to w oparciu o bardzo lubianego przeze mnie TextCrawlera ale chyba się myliłem. Mam przygotowany plik csv a w nim listę z nazwami plików, to co ma być w nich znalezione (wyrażenie regularne – nota bene we wszystkich przypadkach jest takie samo), oraz ciąg który ma zostać dopisany do danego pliku.
Macie jakieś pomysły. Z góry dzięki
gordom

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 20 Sty 2013, 22:17
przez Haczyk
Witam,

Dla testów wybiorę:
gordom napisał(a):Linuxem


gordom napisał(a):wyszukanie konkretnej frazy we wszystkich plikach tekstowych w danym katalogu z zastosowaniem wyrażenia regularnego,


Kod: Zaznacz wszystko
haczyk@stronghold:~/test$ ls -l
total 12
-rw-r--r-- 1 haczyk haczyk  8 Jan 20 21:07 file1.txt
-rw-r--r-- 1 haczyk haczyk 10 Jan 20 21:07 file2.txt
-rw-r--r-- 1 haczyk haczyk  8 Jan 20 21:07 file3
haczyk@stronghold:~/test$

haczyk@stronghold:~/test$ grep . *
file1.txt:1
file1.txt:2
file1.txt:3
file1.txt:4
file2.txt:1
file2.txt:2
file2.txt:3
file2.txt:4
file2.txt:5
file3:1
file3:2
file3:3
file3:4
haczyk@stronghold:~/test$#testowa zamiana "2" na "7"
haczyk@stronghold:~/test$ sed -e 's/2/7/' *.txt
1
7
3
4
1
7
3
4
5
haczyk@stronghold:~/test$#jesli wszystko zadzialalo poprawnie to mozna wprowadzic zmiany
haczyk@stronghold:~/test$ sed -e 's/2/7/' *.txt
haczyk@stronghold:~/test$ grep . *
file1.txt:1
file1.txt:7
file1.txt:3
file1.txt:4
file2.txt:1
file2.txt:7
file2.txt:3
file2.txt:4
file2.txt:5
file3:1
file3:2
file3:3
file3:4
haczyk@stronghold:~/test$



gordom napisał(a):oraz podmianę tej frazy innym ciągiem, ale uwaga, osobnym i unikalnym dla każdego z plików.

Nie do konca rozumiem jak ma to działać, ale efekt chyba mozna osiagnac przy uzyciu sed-a (ewentualnie jakies dodatkowe narzędzia)

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 21 Sty 2013, 16:46
przez gordom
Haczyk napisał(a):Nie do konca rozumiem jak ma to działać


W oparciu o wczytany plik tekstowy. Trochę tak jak wczytujemy do wgeta listę adresów do pobrania (wget -i). Tu mielibyśmy listę plików (1 kolumna), co ma zostać znalezione (2 kolumna), na co ma być zamienione (3 kolumna). Tak to sobie wyobrażam. Dodatkowo można by było stosować wyrażenia regularne.

gordom

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 22 Sty 2013, 00:05
przez Haczyk
Nie podałeś przykładowego pliku wejściowego, więc u mnie plik wygląda tak:
<filename>;<old_pattern>;<new_pattern>
Kod: Zaznacz wszystko
haczyk@stronghold:~/test$ cat file.csv
file1.txt;2;7
file2.txt;3;7
file3;1;7
haczyk@stronghold:~/test$

Skrypt czyta każda linię pliku csv i odpowiednio przypisuje zmienne ($file,$pattern1,$pattern2)
Kod: Zaznacz wszystko
haczyk@stronghold:~/test$ cat skrypt.sh
#!/bin/bash

for i in `cat file.csv`; do
file=`echo $i | cut -d ";" -f1`;
pattern1=`echo $i | cut -d ";" -f2`;
pattern2=`echo $i | cut -d ";" -f3`;
sed -i "s/$pattern1/$pattern2/" $file;
done
haczyk@stronghold:~/test$

Kod: Zaznacz wszystko
haczyk@stronghold:~/test$ bash skrypt.sh
haczyk@stronghold:~/test$ grep . file{1,2,3}*
file1.txt:1
file1.txt:7
file1.txt:3
file1.txt:4
file2.txt:1
file2.txt:2
file2.txt:7
file2.txt:4
file2.txt:5
file3:7
file3:2
file3:3
file3:4
haczyk@stronghold:~/test$

Przetestuj proszę i daj znać czy śmiga jak należy.

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 25 Sty 2013, 21:24
przez gordom
@Haczyk
Cześć. Dzięki za pomoc. Na plikach przykładowych działa :). Jak to zwykle bywa - gorzej w realnym życiu. Rzeczywisty tekst, który podmieniam, jest bardziej skomplikowany (de facto to fragment tekstu a nie 1 wyraz, na dokładkę ze znakami specjalnymi). Konsola zwraca mi cały szereg błędów które, jak podejrzewam, wynikają ze stosowania spacji w tekście. Myślałem, że ujęcie fragmentu szukanego i zamienianego tekstu w znak podwójnego cudzysłowu (") rozwiąże problem ale się myliłem. Oj cienki jestem z pracą konsolową. Możesz zasugerować rozwiązanie?
pozdr.,
gordom

Znajdź zastąp txt unikalnym ciągiem innym dla każdego pliku

PostWysłany: 29 Sty 2013, 20:11
przez Haczyk
czy byłaby możliwość wkleić tutaj przykładowy pattern?

Strata czasu aby testować "w ciemno" :lol: