• Ogłoszenie:

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

Możliwość napisania tematu bez konieczności logowania. Zapraszamy do zadawania pytań niezarejestrowanych użytkowników.

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

Postprzez gordom 18 Sty 2013, 22:27

reklama
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
gordom
 



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

Postprzez Haczyk 20 Sty 2013, 22:17

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)
Pozdrawiam
Awatar użytkownika
Haczyk
~user
 
Posty: 797
Dołączenie: 21 Sty 2006, 16:11
Miejscowość: Drzewica/Bydgoszcz
Pochwały: 62



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

Postprzez gordom 21 Sty 2013, 16:46

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
gordom
 



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

Postprzez Haczyk 22 Sty 2013, 00:05

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.
Pozdrawiam
Awatar użytkownika
Haczyk
~user
 
Posty: 797
Dołączenie: 21 Sty 2006, 16:11
Miejscowość: Drzewica/Bydgoszcz
Pochwały: 62



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

Postprzez gordom 25 Sty 2013, 21:24

@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
gordom
 



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

Postprzez Haczyk 29 Sty 2013, 20:11

czy byłaby możliwość wkleić tutaj przykładowy pattern?

Strata czasu aby testować "w ciemno" :lol:
Pozdrawiam
Awatar użytkownika
Haczyk
~user
 
Posty: 797
Dołączenie: 21 Sty 2006, 16:11
Miejscowość: Drzewica/Bydgoszcz
Pochwały: 62




Powróć do Szybkie Pytania i Odpowiedzi

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 10 gości