/ / zapisuj każdy blok tekstu między dwoma znacznikami do pliku z sed - bash, shell, sed

napisz każdy blok tekstu pomiędzy dwoma markerami do pliku z sed - bash, shell, sed

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 № 1

To 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.