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/.
Mam ci ja plik w formacie:
Lorem ipsum * dolor * sit * amet
Muszę go przerobić na:
Lorem ipsum * dolor * sit * amet
ewentualnie (choć wolę powyższy):
Lorem ipsum * dolor * sit * amet
Wszystko jedno czy sed, czy awk, czy tr, czy perl (jeśli już nie da się po ludzku ;)) czy inny pies, byle tekstowo. Dumam nad tym i dumam... Pomożecie?
Offline
Takie cuś będzie dobre?
sed 's/\(Lorem ipsum\)/\1\n/'
$ cat test.txt Lorem ipsum * dolor * sit * amet $ sed -i 's/\(Lorem ipsum\)/\1\n/' test.txt $ cat test.txt Lorem ipsum * dolor * sit * amet [lessmian@polikarp:~/scripts]$
Offline
Tak, tylko to Lorem ipsum to był przykład. Chodzi o uniwersalną metodę oddzielenie jakiegoś „zwykłego” tekstu, od tego zaczynającego się od „*”.
Offline
azhag napisał(-a):
Chodzi o uniwersalną metodę oddzielenie jakiegoś „zwykłego” tekstu, od tego zaczynającego się od „*”
Tego akurat nie napisałeś w pierwszym poście ;)
Można to zrobić tak:
sed '0,/\(^\*\)/s//\n\1/'
Ale to znowu zadziała tylko dla pierwszego bloku tekstu - jeśli w pliku będzie więcej takich, trzeba poszukać czegoś innego.
Offline
W awku się da - możesz zapamiętać czy poprzednia linia zaczynała się gwiazdką i jeśli nie, a bieżąca zaczyna się gwiazdką to dodajesz przed bieżącą znak nowej linii. Tak samo dla przypadku odwrotnego...
cat dupa.txt | awk 'BEGIN {a=0}; {b=0; if (substr($0,0,1) == "*") b=1;if (a !=b) print "";a=b;print $0 }'
Może być?
Pewnie można prościej ale właśnie wypiłem jedenaste piwo :)
Offline
lessmian napisał(-a):
azhag napisał(-a):
Chodzi o uniwersalną metodę oddzielenie jakiegoś „zwykłego” tekstu, od tego zaczynającego się od „*”
Tego akurat nie napisałeś w pierwszym poście ;)
No... przynajmniej nie wprost, jedynie wspomniałem o „formacie”. Moja wina :)
lessmian napisał(-a):
Można to zrobić tak:
Kod:
sed '0,/\(^\*\)/s//\n\1/'Ale to znowu zadziała tylko dla pierwszego bloku tekstu - jeśli w pliku będzie więcej takich, trzeba poszukać czegoś innego.
O, dzięki wielkie. :)
Na razie biorę to, jak ktoś wymyśli co zrobić, jeśli owe bloki występować będą częściej.
W międzyczasie wydumałem (jeżu, przecież to takie banalne!) jak zrobić, aby zawsze stawiał znak nowej linii, również między liniami zaczynające się od gwiazdki):
sed "s/^*/\n*/g" plik
Dopisek:
ethanak napisał(-a):
W awku się da - możesz zapamiętać czy poprzednia linia zaczynała się gwiazdką i jeśli nie, a bieżąca zaczyna się gwiazdką to dodajesz przed bieżącą znak nowej linii. Tak samo dla przypadku odwrotnego...
Kod:
cat dupa.txt | awk 'BEGIN {a=0}; {b=0; if (substr($0,0,1) == "*") b=1;if (a !=b) print "";a=b;print $0 }'Może być?
Dzięki. :)
ethanak napisał(-a):
Pewnie można prościej ale właśnie wypiłem jedenaste piwo :)
Pozdrów ode mnie dwunaste. ;)
Ostatnio edytowany przez azhag (2010-07-28 21:46:09)
Offline
Ha, dłubałem i wydłubałem :)
sed '/^[^*]/{n;s/\(^*\)/\n\1/}'
Jednak ten sed nie jest taki głupi ;>
Ostatnio edytowany przez lessmian (2010-07-28 22:42:09)
Offline
lessmian napisał(-a):
Ha, dłubałem i wydłubałem :)
Kod:
sed '/^[^*]/{n;s/\(^*\)/\n\1/}'Jednak ten sed nie jest taki głupi ;>
nie do końca działa:
azhag@debian:/tmp$ cat plik3 Lorem ipsum * dolor * sit * amet azhag@debian:/tmp$ cat plik2 Lorem ipsum dolor sit * dolor * sit * amet azhag@debian:/tmp$ sed '/^[^\*]/{n;s/\(^\*\)/\n\1/}' plik3 Lorem ipsum * dolor * sit * amet azhag@debian:/tmp$ sed '/^[^\*]/{n;s/\(^\*\)/\n\1/}' plik2 Lorem ipsum dolor sit * dolor * sit * amet
Offline
Czary. Na Twoim pliku nie działa, na moim napisanym z palca śmiga aż miło.
$ cat test3.txt foo Bar baz * dupa * cycki $ sed '/^[^\*]/{n;s/\(\*\)/\n\1/}' test3.txt foo Bar baz * dupa * cycki
Chwilowo się poddaje, hgw, idę spać ;)
Offline
U mnie na Twoim też śmiga, nawet po dopisaniu tego czy tamtego... Czary.
Debianoc. :)
Offline