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





Cenzor wirtualnego świata
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







Podobno człowiek...;)








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





Cenzor wirtualnego świata



Redaktor




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





Cenzor wirtualnego świata
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



Redaktor




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

Użytkownik


echo '' | sed -n 's/!\[.*](\/img\(.*\))/[\1]/p'
u mnie działa
Ostatnio edytowany przez numer_inaczej (2021-10-30 15:24:38)
Offline





Cenzor wirtualnego świata
Nie działa. xD
Orginal był:

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

Offline

Użytkownik


Teraz zgodnie z oczekiwaniami:
echo '' | sed -n 's/!\[.*\](\(\(.*\)\.\(.*\)\.\(.*\)\))//p'
Ostatnio edytowany przez numer_inaczej (2021-10-31 10:10:08)
Offline





Cenzor wirtualnego świata
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

Użytkownik


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





Cenzor wirtualnego świata
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





Cenzor wirtualnego świata

Użytkownik


Tak, `g' to flaga global (p jest dla pojedynczego wiersza)
Offline





Cenzor wirtualnego świata
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

Użytkownik


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





Cenzor wirtualnego świata
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

Użytkownik


już jest, patrz wyżej :)
Ostateczna wersja daje:

Ostatnio edytowany przez numer_inaczej (2021-11-01 00:49:58)
Offline





Cenzor wirtualnego świata
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

Użytkownik


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





Cenzor wirtualnego świata





Cenzor wirtualnego świata
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





Cenzor wirtualnego świata
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





Cenzor wirtualnego świata
Mam takie pytanie: dlaczego to poniższe:
$ echo '|  |  |  |' | sed 's@^| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |$@|  |@'
zwraca taki wynik?
|  |
a nie:
|  |
albo
|  |  |  |
Offline

Użytkownik


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