Mam plik tekstowy, który chcę podzielić na 64 nierówne części, zgodnie z 64 heksagramami Yi Jing. Ponieważ fragment każdego heksagramu zaczyna się cyfrą (kropkami), kropką i dwiema znakami nowego wiersza, wyrażenie regularne powinno być dość łatwe do napisania.
Ale jak właściwie podzielić plik tekstowy na 64 nowe pliki zgodnie z tym wyrażeniem regularnym? To wydaje się bardziej zadaniem perl
. Ale może istnieje bardziej oczywisty sposób, że po prostu całkowicie mi brakuje.
regular-expression
split
ixtmixilix
źródło
źródło
'\.'
nie będzie działać?Myślę, że najlepszym sposobem jest
awk
igawk
.awk
-F
określi separator pól dla każdej linii. Jest to wyrażenie regularne, tutaj używamy wielu separatorów:". "
i" / "
. W ten sposób podobny wiersz1. Ch'ien / The Creative
zostanie podzielony na 3 pola:1
Ch'ien
iThe Creative
. Później możemy odwoływać się do tych pól za pomocą$n
.$0
to cała linia.Następnie mówimy awk, aby dopasował linie do wzoru.
^[0-9]{1,3}[.]
Jeśli istnieje dopasowanie, wówczas przypisujemy wartość dox
. Wartość x zostanie użyta jako nazwa pliku doprint
operacji. W tym przykładzie używamy,"F"$1"("$2").txt"
więc linia1. Ch'ien / The Creative
podaje nazwę plikuF1(Ch'ien).txt
gapić się
W gawk możemy również uzyskać dostęp do przechwyconej grupy. Możemy więc uprościć polecenie, aby:
tutaj używamy
match
przechwytywania grup i umieszczamy je na liście zmiennychary
.$0
to cała linia.ary[0]
wszystko jest dopasowane.ary[1...n]
jest każda grupa.perl
Możemy to również zrobić za pomocą Perla:
Wyniki:
jak zdobyć przykładowy plik:
źródło
W coreutils GNU możesz użyć
csplit
do rozbicia pliku na fragmenty wyrażone wyrażeniami regularnymi , jak pokazuje geekozaur .Oto przenośny skrypt awk do rozbicia pliku na części. Działa przez
getline
do obsługi separatora wieloliniowego (2-liniowego);outfile
na nazwę pliku do wydrukowania, gdy napotkasz nagłówek sekcji.źródło
nunber.
następuje tekst zawierający ukośnik/
. Jestem prawie pewien, że wspomnianytwo newlines
ixtmixilix to 2 puste wiersze poprzedzające identyfikator numeryczny i dokładniej identyfikujące nagłówek, ale ponieważ dane na stronie internetowej pasują tylko/^[0-9]+\.
do nagłówków sekcji, nie trzeba ich uwzględniać ( w tym konkretnym przypadku). dzięki; szczególnie za wprowadzenie dogetline
... PS. może być, jeśli?while
istnieje w przypadku, gdy dane wejściowe zawierają1.\n2.\n\n
(gdzie\n
są znaki nowego wiersza):2.
należy je rozpoznać w wierszu nagłówka. Nie będzie się tutaj pojawiać, ale popieram go w moim kodzie, aby był bardziej ogólny (i ściślej pasował do specyfikacji w pytaniu).