Rozważmy wejście:wyjątkiem pierwszej i ostatniej linii z sed/Start /,/END/
=sec1=
some-line
some-other-line
foo
bar=baz
=sec2=
c=baz
Jeśli chcesz przetwarzać tylko = Sec1 = mogę na przykład Wykomentuj sekcję przez:
sed -e '/=sec1=/,/=[a-z]*=/s:^:#:' < input
... no, prawie.
To będzie komentować linii tym „= seC1 =” a „= s2 =” linie, a rezultatem będzie coś takiego:
#=sec1=
#some-line
#some-other-line
#
#foo
#bar=baz
#
#=sec2=
c=baz
Moje pytanie brzmi: Jaki jest najprostszy sposób aby wykluczyć linie początkową i końcową z zakresu/START /,/END/w numerze?
Wiem, że dla wielu przypadków udoskonalenie pazurów "s :::" może dać rozwiązanie w tym konkretnym przypadku, ale jestem tutaj po ogólnym rozwiązaniu.
W "Sed - An Introduction and Tutorial" Bruce Barnett pisze: "Pokażę ci później, jak ograniczyć polecenie do, ale nie wliczając linii zawierającej określony wzorzec.", Ale nie byłem w stanie znaleźć, gdzie on to pokazuje .
W "USEFUL ONE-LINE SCRIPTS FOR SED" opracowany przez Eric Pementa, udało mi się znaleźć tylko przykład Inclusive:
# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p' # case sensitive
Tak, to dokładnie to, co ja szukałem. Dzięki. –
Dla osób na MacOS z BSD sed musisz użyć rzeczywistych linii specjalnych zamiast średników. Aby uzyskać więcej informacji, sprawdź [tę odpowiedź] (http://stackoverflow.com/a/15470635/2909897) – mbigras
nie wiesz o innych wersjach, ale z GNU sed, można to łatwo zrobić za pomocą ''/ = sec1 = /,/= sec2 =/{//! s/^/# /} ''... from [manual] (https://www.gnu.org/software/sed/manual/sed.html#Regexp-Addresses)' puste wyrażenie regularne' // 'powtórzenia ostatnie wyrażenie regularne dopasowanie ' – Sundeep