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:
![](/img/2016/08/001.jakis-tam-text1.jpg#huge)
Trzeba z tego zrobić coś na poniższy wzór:
![jakis tam text1](/img/2016/08/001.jakis-tam-text1.jpg#huge)
Czyli w miejsce między [ ] trzeba wstawić nazwę obrazka.
Problem jest jeszcze taki, że niektóre pliki tekstowe mają takie linijki:
| ![](/img/2021/10/004.jakis-tam-text2.jpg#small) | ![](/img/2021/10/005.jakis-tam-text3.jpg#small) |
i te linijki trzeba również przepisać do
| ![jakis tam text2](/img/2021/10/004.jakis-tam-text2.jpg#small) | ![jakis tam text3](/img/2021/10/005.jakis-tam-text3.jpg#small) |
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.
Online
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ł
![](/img/2016/08/001.jakis-tam-text1.jpg#huge)
To bez problemu by szło przerobić do
![jakis tam text1](/img/2016/08/001.jakis-tam-text1.jpg#huge)
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 '![](/img/2016/08/001.jakis-tam-text1.jpg#huge)' | 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ł:
![](/img/2016/08/001.jakis-tam-text1.jpg#huge)
Wyszło:
[/2016/08/001.jakis-tam-text1.jpg#huge]
a miało być
![jakis tam text1](/img/2016/08/001.jakis-tam-text1.jpg#huge)
Offline
Teraz zgodnie z oczekiwaniami:
echo '![](/img/2016/08/001.jakis-tam-text2.jpg#huge)' | sed -n 's/!\[.*\](\(\(.*\)\.\(.*\)\.\(.*\)\))/![\3](\1)/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 ![\3](\1) ? 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 ![](/img/2016/08/001.jakis-tam-text2.jpg#huge) 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 ![jakis-tam-text1](/img/2015/06/1.jakis-tam-text1.png#medium) ![jakis-tam-text1](/img/2015/06/1.jakis-tam-text1.png#medium) 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ć:
![](/img/2016/12/030-jakis-tam-text1.png#big)
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 '![](/img/2016/08/001-jakis-romek-tam-text1.jpg#huge)' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))/![\2](\1-\2.\3)/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:
![jakis-romek-tam-text1.jpg#huge](2016/08/001-jakis-romek-tam-text1.jpg#huge)
A miało wyjść:
![jakis-romek-tam-text1](2016/08/001-jakis-romek-tam-text1.jpg#huge)
tj. bez tej końcówki: .jpg#huge
Ok, widzę, że poprawione już. xD
Ale teraz wychodzi:
![jakis-romek-tam-text1](2016/08/001-jakis-romek-tam-text1)
Gdzieś wcięło: .jpg#huge
Ostatnio edytowany przez morfik (2021-11-01 00:40:06)
Offline
już jest, patrz wyżej :)
Ostateczna wersja daje:
![jakis-romek-tam-text1](2016/08/001-jakis-romek-tam-text1.jpg#huge)
Ostatnio edytowany przez numer_inaczej (2021-11-01 00:49:58)
Offline
No wyszło bardzo podobnie: xD
echo '![](/img/2016/08/001-jakis-romek-tam-text1.jpg#huge)' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))/![\2](\1-\2.\3)/p' echo '![](/img/2016/08/001-jakis-romek-tam-text1.jpg#huge)' | sed -n 's/!\[.*\](\/img\/\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*)\)/![\2](\1-\2\.\3/p'
Trochę się różnią ale dają ten sam efekt.
No ale grunt, że powoli zaczynam to łapać. xD
Ostatnio edytowany przez morfik (2021-11-01 00:57:41)
Offline
sorki, późno jest i mi się miesza, co ma być, czego nie :D zapomniałem o /img/ przed datą.
echo '![](/img/2016/08/001-jakis-romek-tam-text1.jpg#huge)' | sed -n 's/!\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\))/![\3](\1\2-\3.\4)/p'
zwraca:
![jakis-romek-tam-text1](/img/2016/08/001-jakis-romek-tam-text1.jpg#huge)
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:
| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) |
Za cyferkami mogą występować kropki albo myślniki, tak jak wcześniej. Fraz typu ![](/img/2016/12/020.jakis-tam-text1.png#medium) 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:
| ![jakis-tam-text1](/img/2016/12/020.jakis-tam-text1.png#medium) | ![jakis-tam-text2](/img/2016/12/021.jakis-tam-text2.png#medium) |
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]*\)\.\(.*\)\.\(.*\))@| ![\3](\1\2.\3.\4) | ![\7](\5\6.\7.\8)@g' sed 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\-\(.*\)\.\(.*\)) | !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\))@| ![\3](\1\2-\3.\4) | ![\7](\5\6-\7.\8)@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 '| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) | ![](/img/2016/12/022.jakis-tam-text3.png#medium) |' | sed 's@^| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |$@| ![\3](\1\2.\3.\4) |@'
zwraca taki wynik?
| ![jakis-tam-text3](/img/2016/12/022.jakis-tam-text3.png#medium) |
a nie:
| ![jakis-tam-text1](/img/2016/12/020.jakis-tam-text1.png#medium) |
albo
| ![jakis-tam-text1](/img/2016/12/020.jakis-tam-text1.png#medium) | ![jakis-tam-text2](/img/2016/12/021.jakis-tam-text2.png#medium) | ![jakis-tam-text3](/img/2016/12/022.jakis-tam-text3.png#medium) |
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 '| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) | ![](/img/2016/12/022.jakis-tam-text3.png#medium) |' | sed 's@^| ![\[\]]+(\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |$@| ![\3](\1\2.\3.\4) |@'
co daje nam:
| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) | ![](/img/2016/12/022.jakis-tam-text3.png#medium) |
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