Chciałbym wyodrębnić każdy blok tekstu między START
i END
znaczniki do osobnego pliku. Sed byłoby preferowanym narzędziem, ale grep i awk również byłyby w porządku.
Biorąc pod uwagę następującą zawartość pliku:
abc
START
def
END
ghi
START
jkl
END
mno
sed powinien utworzyć odpowiednio dwa pliki z zawartością:
START
def
END
i
START
jkl
END
Wiem, jak pobrać zawartość między dwoma wyrażeniami regularnymi za pomocą sed:
sed -n "/START/,/END/p"
Istnieje również ta opcja, aby wykonywać polecenia powłoki w sed podczas dostarczania e
flaga. Czy można to wykorzystać do tego zadania?
Odpowiedzi:
2 dla odpowiedzi № 1To może ci pomóc (GNU sed):
sed "/START/,/END/!d" file | csplit -z - "/END/1" "{*}"
Użyj sed do zebrania wszystkich linii między separatorami początkowymi i końcowymi, a następnie zastosuj csplit, aby utworzyć osobne pliki dla każdej grupy linii.
1 dla odpowiedzi nr 2
awk, aby zapisać tutaj:
awk "/END/{flag="";print > i"_file";close(i"_file");next} /START/{flag=1;print > ++i"_file";next} flag{print > i"_file"}" Input_file
Wyjście utworzy 2 pliki o nazwach 1_plik i 2 plik z następującą zawartością.
cat 1_file
START
def
END
cat 2_file
START
jkl
END
Dodaje się teraz także rozwiązanie liniowe innego niż jedno rozwiązanie.
awk "
/END/{
flag="";
print > i"_file";
close(i"_file");
next
}
/START/{
flag=1;
print > ++i"_file";
next
}
flag{
print > i"_file"
}
" Input_file
1 dla odpowiedzi nr 3
Bardzo ciekawy csplit
Dzięki potong
Więc bez sed
csplit -z --suppress-matched infile %START%-1 /END/1 {*}
-m = --suppress-matched nie działa.
manpage fr tell -m, ale jest źle.