Nowe posty

Autor Wątek: Skrypt przenoszący wyrazy między liniami  (Przeczytany 2511 razy)

ppsz

  • Gość
Skrypt przenoszący wyrazy między liniami
« dnia: 2015-03-26, 20:54:09 »
Witam,
Czy istnieje możliwość przeniesienia wyrazu z początku jednej linijki na koniec poprzedniej linijki?

Chodzi mi o skrypt, który zamieniłby następującą zawartość pliku tekstowego:

Początek pierwszej linijki i jej
koniec. Początek drugiej linijki i jej
koniec. Początek trzeciej...

na taką:

Początek pierwszej linijki i jej koniec.
Początek drugiej linijki i jej koniec.
Początek trzeciej...

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Skrypt przenoszący wyrazy między liniami
« Odpowiedź #1 dnia: 2015-03-26, 21:52:57 »
Istnieje taka możliwość.

Cytuj
Można to zrealizować na wiele różnych sposobów. Wszytko zależy od DOKŁADNEGO sprecyzowania wymagań, a nie podania przykładu.

Ale zapewne wystarczającą, a przy tym prostą metodą będzie:
1. zamiana wszystkich znaków nowej linii na spacje
2. dla porządku: usunięcie zbędnych spacji z końca linii
3. pocięcie tekstu na nowo na każdej spacji po kropce (można by dodać tu jakieś dodatkowe reguły, np. minimalna długość linii):

cat plik.txt | tr '\\n' ' ' | sed -E 's/\\s+$/\\n/g' | sed 's/\\. /.\\n/g'

ppsz

  • Gość
Skrypt przenoszący wyrazy między liniami
« Odpowiedź #2 dnia: 2015-03-26, 22:50:15 »
Dzięki za odpowiedź.
Przepraszam, faktycznie byłem mało precyzyjny odnośnie mojego problemu. Jest on trochę bardziej złożony niż to co opisałem w poprzednim poście.
Zależy mi na skrypcie, który przenosiłby kilkuliterowe spójniki typu "bo", "lub", "gdyż" z początku jednego wiersza na koniec wiersza poprzedniego. Spójniki będące w innym miejscu niż początek wiersza powinny zostać nietknięte.
Plik wejściowy zawierałby bardziej złożony tekst, np. referat.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Skrypt przenoszący wyrazy między liniami
« Odpowiedź #3 dnia: 2015-03-26, 23:47:09 »
Rozwiązanie jest dość oczywistym przetworzeniem opisu problemu na wyrażenie regularne (\\n + spójnik + spacja) i sprowadza się do zamiany go na nieco inny ciąg znaków (spacja + spójnik + \\n):
SPOJNIKI='bo|lub|gdyz|i|co'
cat plik.txt | perl -p -000 -e "s/\\n($SPOJNIKI) / \\$1\\n/g"
Polecenie 'sed' nie obsługuje wielu linii, ale perl już tak.

Tyle, że takie spójniki przenosi się właśnie do nowej linii, żeby nie zostawiać ich na końcu: http://pl.wikipedia.org/wiki/Wiszący_spójnik
Czyli dokładnie odwrotnie niż opisany problem.

ppsz

  • Gość
Skrypt przenoszący wyrazy między liniami
« Odpowiedź #4 dnia: 2015-03-27, 01:03:47 »
Wielkie dzięki!
Właśnie czegoś takiego było mi trzeba. Zrezygnowałem jednak z cata i dodałem po prostu "-i" do perla.
Mam jednak pytanie co dokładnie oznacza opcja "-000"?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Skrypt przenoszący wyrazy między liniami
« Odpowiedź #5 dnia: 2015-03-27, 19:23:51 »
> Zrezygnowałem jednak z cata i dodałem po prostu "-i" do perla

cat i pipe pozwalają pokazać generyczne polecenie działające na standardowym wejściu

Poza tym zastosowaniem nie jest zbyt elegancki,
bo lepiej użyć właśnie wbudowanych opcji danego polecenia,
lub przekierowania wejścia "... < plik.txt"

> Mam jednak pytanie co dokładnie oznacza opcja "-000"?

W sumie to wystarczą 2 zera (albo ewentualnie -0777, jeśli chcemy zachować wielokrotne puste linie):
http://www.math.uiuc.edu/~hildebr/computer/perltips.html ("Operating on entire files")