Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Jest sobie sporo plików tekstowych i część z nich kwalifikuje się do poprawy. Chodzi o to, że dany plik może zawierać od zera do kilkudziesięciu wystąpień takich fraz jak ta poniższa:

Trzeba z tego zrobić coś na poniższy wzór:

Czyli w miejsce między [ ] trzeba wstawić nazwę obrazka.
Problem jest jeszcze taki, że niektóre pliki tekstowe mają takie linijki:
|  |  |
i te linijki trzeba również przepisać do
|  |  |
Ktoś ma pomysł jak to hurtowo przerobić? xD
Offline
sed -i 's$cośtam$cośinnegotam$g' *
poleci po wszystkich plikach w katalogu.
Tylko wynik niektórych prób może nie być satysfakcjonujący, więc testuj na kopii najpierw.
Offline
Ja korzystam z tego:
sed 's/frazaoryginalna/frazazamieniana/' wejsciowy.txt > wyjsciowy.txt
A tu masz skrypt bercika rozwijający to:
https://dug.net.pl/drukuj/58/masowa_edycja_duzej_il … w_tekstowych/
Offline
To przecie nie zadziała. xD Ja wiem, że gdyby każdy plik miał

To bez problemu by szło przerobić do

Ale tutaj każdy plik ma ten kawałek inny i nawet w tym samym pliku jest kilka innych takich kawałków. Różnią się one tym co stoi po /img/ i nazwę takiego obrazka trzeba by wstawić między [ ], które jest wcześniej. Więc tutaj sam sed nie zdziała, bo trzeba trochę bardziej zaawansowanej magii. xD
Offline
morfik, ja raczej jestem odtwórcą gotowych skryptów. Może spróbuj skorzystać z generatora wyrażeń regularnych, aby opisać problem dla jakiegoś narzędzia.
apt info rgxg
Offline
echo '' | sed -n 's/!\[.*](\/img\(.*\))/[\1]/p'
u mnie działa
Ostatnio edytowany przez numer_inaczej (2021-10-30 15:24:38)
Offline
Nie działa. xD
Orginal był:

Wyszło:
[/2016/08/001.jakis-tam-text1.jpg#huge]
a miało być

Offline
Teraz zgodnie z oczekiwaniami:
echo '' | sed -n 's/!\[.*\](\(\(.*\)\.\(.*\)\.\(.*\)\))//p'
Ostatnio edytowany przez numer_inaczej (2021-10-31 10:10:08)
Offline
Hmm, no wygląda, że robi co powinno przynajmniej ten kluczowy element, o który mi chodzi, resztę jakoś sobie ogarnę. xD
A mógłbyś mi jeszcze napisać co dokładnie robi  ? xD
Ostatnio edytowany przez morfik (2021-10-31 19:45:42)
Offline
Zawartość nawiasów \(.*\) jest przywoływana w momencie postawienia \1 lub \3.
Są to tzw. odwołania wsteczne które określa nawias okrągły.
\1 - to zawartość Twego okrągłego nawiasu.
Kropki między wewnętrznymi nawiasami oddzielają interesujący Cię tekst.(2 i 3 - nawiasy wewnęrzne)
Offline
numer_inaczej napisał(-a):
Zawartość nawiasów \(.*\) jest przywoływana w momencie postawienia \1 lub \3.
Są to tzw. odwołania wsteczne które określa nawias okrągły.
\1 - to zawartość Twego okrągłego nawiasu.
Kropki między wewnętrznymi nawiasami oddzielają interesujący Cię tekst.(2 i 3 - nawiasy wewnęrzne)
Metodą prób i błędów doszedłem do tych samych wniosków. xD
Jest jednak jeden problem. Jak podam zawartość pliku, który ma coś na wzór  i przepuszczę to przez twojego sed'a, to mam w zasadzie wyczyszczony plik, tj. jakakolwiek inna treść z tego pliku jest kasowana. W pliku zostają tylko uzupełnione linijki zawierające frazy podobne do tej powyżej. Jak usunę parametr -n z tego polecenia co dałeś, to nie czyści mi pliku z tekstu ale każda fraza jest zdublowana (jedna pod drugą), co wygląda mniej więcej tak:
text text text text text text text text text text text text text text text text text   text text text text text text text text text text text text text text
Jak to obejść? xD
Offline
Tak, `g' to flaga global (p jest dla pojedynczego wiersza)
Offline
No pierwsza seria poszła. Trochę błędów miałem ale to przez literówki w tekście źródłowym ale przy okazji popoprawiałem wszystko. xD
Szkoda, że mi się zmienił styl pisania tekstów na przestrzeni lat i mam lekką niekonsekwencje w zapiskach.
Np. trzeba jeszcze teraz to przepisać:

Różni się on od tego poprzedniego tym, że tutaj po numerku stoi myślnik, a nie kropka i tak łatwo już chyba nie będzie? xD Tych fraz między myślnikami może być dowolna ilość (od kilku do kilkunastu).
Jakieś sugestie? xD
Offline
EDIT:
echo '' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))//p'
Tym razem trzeba było określić powtarzające się znaki cyfr `[0-9]' odzielone separatorem ukośnika.
Ażeby nie brał pod uwagę znaczenia specjalnego ukośnika, musimy poprzedzić go odwrotnym.
Uważaj na to, że dopasowania są 'zachłanne' - czyli jeśli są dwa zamknięte nawiasy, to będzie pożerał do max wysuniętego. Stąd takie manipulacje.
Ostatnio edytowany przez numer_inaczej (2021-11-01 00:46:48)
Offline
Z tego co widzę, to wyszło:

A miało wyjść:

tj. bez tej końcówki: .jpg#huge
Ok, widzę, że poprawione już. xD
Ale teraz wychodzi:

Gdzieś wcięło: .jpg#huge
Ostatnio edytowany przez morfik (2021-11-01 00:40:06)
Offline
już jest, patrz wyżej :)
Ostateczna wersja daje:

Ostatnio edytowany przez numer_inaczej (2021-11-01 00:49:58)
Offline
No wyszło bardzo podobnie: xD
echo '' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))//p' echo '' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*)\)/
Offline
sorki, późno jest i mi się miesza, co ma być, czego nie :D zapomniałem o /img/ przed datą.
echo '' | sed -n 's/!\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))//p'
zwraca:

Ostatnio edytowany przez numer_inaczej (2021-11-01 01:06:25)
Offline
Dobra druga partia też jest z głowy. Została ostatnia. xD
Mamy linijki typu wcześniejszego w takim układzie:
|  |  |
Za cyferkami mogą występować kropki albo myślniki, tak jak wcześniej. Fraz typu  w jednej linijce może być kilka ale nie mniej niż dwie. Na początku linijki i końcu jest znak pipe | oraz poszczególne frazy są nim od siebie oddzielone.
Trzeba to przerobić do poniższej postaci:
|  |  |
Offline
Zrobiłem coś takiego ale to nie jest za bardzo skalowalne. xD
sed 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) | !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\))@|  | @g' sed 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\)) | !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\))@|  | @g'
Ale łapie ten powyższy przypadek.
Dla 3 trzeba by dorobić kolejny człon i dla 4 jeszcze jeden ale to chyba nie tędy droga? xD
Offline
Mam takie pytanie: dlaczego to poniższe:
$ echo '|  |  |  |' | sed 's@^| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |$@|  |@'
zwraca taki wynik?
|  |
a nie:
|  |
albo
|  |  |  |
Offline
Wydaje mi się, że:
- pierwotnie założyłem, że nawias kwadratowy [] może zawierać jakiś tekst - umieszczając wewnątrz .*
- przy większej ilości musimy zdjąć specjalne znaczenie nawiasu poprzedzając go ukośnikiem \[\], wcisnąć go w zakres jaki może się powtórzyć [\[\]] i określić znakiem +, że może się powtórzyć 1 lub więcej razy
czyli powinno być:
echo '|  |  |  |' | sed 's@^| ![\[\]]+(\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |$@|  |@'
co daje nam:
|  |  |  |
Wiem, że jest to punktem takim newralgicznym zapisu, jednak głowy nie dam uciąć że tak to jest jak określiłem
Ostatnio edytowany przez numer_inaczej (2021-11-01 11:40:42)
Offline