Mam w zwyczaju pisać jedną linię na zdanie, ponieważ zwykle kompiluję różne rzeczy do LaTexa lub piszę w innym formacie, w którym łamanie linii jest ignorowane. Używam pustej linii, aby wskazać początek nowego akapitu.
Teraz mam plik napisany w tym stylu, który chciałbym wysłać jako zwykły tekst. Chcę usunąć wszystkie pojedyncze łamanie linii, ale pozostawić nienaruszone podwójne łamanie linii. Oto co zrobiłem:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Zastępuje to puste wiersze pewnym tekstem, który, jak jestem pewien, nie pojawia się w pliku: NEWLINE
a następnie usuwa wszystkie podziały wiersza za pomocą awk (znalazłem tę sztuczkę na niektórych stronach internetowych), a następnie zastępuje NEWLINE
s wymaganymi dwoma podziałami linii .
Wydaje się, że to długa, kręta droga do zrobienia całkiem prostej rzeczy. Czy istnieje prostszy sposób? Ponadto, gdyby istniał sposób na zastąpienie wielu spacji (które z jakiegoś powodu czasem się wkradają) pojedynczymi spacjami, to też byłoby dobrze.
Używam emacsa, więc jeśli jest jakaś sztuczka specyficzna dla emacsa, to dobrze, ale wolałbym zobaczyć wersję w wersji sed lub czystej awk.
tr -d "\n"
.Odpowiedzi:
Możesz użyć awk w następujący sposób:
Lub jeśli potrzebujesz dodatkowej nowej linii na końcu:
Lub jeśli chcesz oddzielić akapity nowym znakiem:
Te polecenia awk wykorzystują działania chronione przez wzorce:
lub
Następujące działanie jest wykonywane tylko wtedy, gdy wzorzec pasuje do bieżącej linii.
A
^$.
znaki mają specjalne znaczenie w wyrażeniach regularnych, gdzie^
pasują do początku linii,$
końca i.
dowolnego znaku.źródło
/./
dzieje: wydaje się, że działa tak, jakelse
w przypadku/^$/
dopasowania ciągu, prawda?Użyj trybu akapitowego Awk lub Perla do przetwarzania pliku akapit po akapicie, gdzie akapity są oddzielone pustymi liniami.
Oczywiście, ponieważ nie analizuje to (La) TeXa, okropnie okaleczy komentarze, dosłowne środowiska i inną specjalną składnię. Możesz zajrzeć do DeTeXa lub innych (La) konwerterów TeX-to-text.
źródło
Sed Solution
Zauważ, że w tym rozwiązaniu
:a
jest tworzenie etykiety i nie używaniea
polecenia.Zamiana wielu spacji
Użyj
tr
:$ tr -s ' ' <test.text
źródło
Jeśli ja zrozumiałem, pusta linia oznacza dwa kolejne znaki nowej linii,
\n\n
.Jeśli tak, jednym z możliwych rozwiązań byłoby wyeliminowanie wszystkich pojedynczych wystąpień nowych linii.
W Perlu jednym ze sposobów osiągnięcia tego jest stwierdzenie z wyprzedzeniem:
-0777
Flag skutecznie slurps całego pliku w jeden ciąg-p
każe perlowi wydrukować ciąg, na którym domyślnie działa-i
określa edycję w miejscuźródło
(ożywiając starożytne pytanie)
Wydaje się, że jest to dokładnie to, co jest
fmt
ipar
jest - przeformatowanie akapitu. Podobnie jak Ty (a także wiele programów), definiują granice akapitów jako jedną (lub więcej) pustych linii. Spróbuj przesłać tekst jednym z nich.fmt
jest standardowym narzędziem uniksowym i można go znaleźć w GNU Coreutils.par
jest znacznie ulepszonym,fmt
napisanym przez Adama M. Costello, który można znaleźć na stronie http://www.nicemice.net/par/ (został również spakowany dla kilku dystrybucji, w tym debian - spakowałem go dla debiana w styczniu 1996 roku, chociaż jest teraz nowy opiekun pakietu pkg).źródło
sed
doda dowolny wiersz doH
starej spacji, która zawiera co najmniej jeden znak. Zaraz potemd
usuwa wszystkie te, z wyjątkiem chyba ostatniego. Jedynymi liniami, które mogą pozostać, są puste i znajdują się na tych liniach, gdysed
ex
zmienia przestrzenie wstrzymania i wzoru oraz usuwa wszystkie zgromadzone\n
znaki ewline.Jeśli chcesz, aby wiersze zawierające tylko <tabs> lub <spaces> były uważane za puste, zamień
/./
powyższy adres na/[^[:blank:]]/
. Aby również wycisnąć spacje, wykonaj:źródło
Po obejrzeniu zwięzłych przykładów perla i awk Gillesa, nie chciałem tego publikować, ale już przeszedłem ćwiczenie i jest to działający skrypt, który jest właściwie udokumentowany; ten punkt może być interesujący dla niektórych (sed z komentarzami! :)
Ten skrypt uważa puste linie za puste, nawet jeśli zawierają spacje.
Wiele spacji w tekście jest skondensowanych do pojedynczej spacji.
Końcowe białe znaki są usuwane z linii tekstu. Kolejne puste linie są zwinięte do pojedynczej linii. Skrypt pozostawia nienaruszone górne i dolne puste wiersze.
W przypadku czegokolwiek więcej niż najbardziej trywialnych skryptów, sed może być napisany o wiele łatwiej w formie ustrukturyzowanej, jako osobny plik skryptu. Oto taki przykład.
używając rozszerzonego
wywołania wyrażenia regularnego : $ sed -rf plik tekstowy skryptu
Uwaga:
flush
w komentarzach oznacza: wyślij przestrzeń wzorców do wewnętrznej obsługi standardowej sed. Nie oznacza to wyraźnego wydruku na standardowe wyjście. Wydajność zależy od-n
opcji sed . na przykład.q
środki dowodzenia równo i rzucić ... Porównaj te dwa fragmenty:echo x |sed -e q
drukuje x,echo x |sed -ne q
nie drukuje, natomiast za pomocąp
polecenia byłoby wydrukować „x” dwa razy lub raz, w zależności od-n
opcji.źródło
Oto jeszcze jedno
sed
rozwiązanie, które łączy wszystkie linie wsed
„przestrzeń wstrzymania”, dzięki czemu otrzymujemy jeden długi ciąg znaków, który ostatecznie jest kopiowany do „przestrzeni wzorów” w celu dopasowania wzorca.Ponieważ znaki nowej linii zostaną zachowane w końcowym długim łańcuchu w
sed
„przestrzeni wzorów”, puste linie pod względem podwójnych podziałów linii[^\n]\n\n[^\n]
można dopasowywać i modyfikować[^\n]\n[^\n]
.Aby uzyskać więcej informacji, zobacz na przykład sed i Multi-Line Search and Replace .
źródło
Może to być stara szkoła:
Spowoduje to wyświetlenie tekstu wyrównanego do lewej (
.ad l
), o długości linii 80 (.ll 80
). Opcja długości strony (.pl
) nakazuje procesorowi tekstu wypełnienie strony dla długości strony 1, więc brak dopełniania strony.Jeśli chcesz wszystkie akapity w jednym wierszu, możesz użyć dużej liczby do
.ll
:man 7 groff po więcej opcji formatowania.
źródło
W Emacsie czasami używam tego
regex
:Znaczy:
źródło
Okazuje się, że z
auto-fill-mode
włączoną emacs wykonuje całkiem niezłą robotę w moich prostych przypadkach użycia zM-q
...źródło
auto-fill-mode
zależy od tego, jaki tryb główny masz aktywny.