Z gawk
, można użyć dopasowania funkcji:
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
Jeśli jesteś ok z perl
, bardziej elastyczne rozwiązanie: Po wydrukuje trzy znaki przed wzór następnie faktycznego wzoru, a następnie 5 znaków na wzór .
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
Można to również zastosować do słów, a nie tylko znaków. Po wpisaniu zostanie wydrukowane jedno słowo przed właściwym pasującym ciągiem.
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey
Po drukuje jedno słowo po wzoru:
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how
Po drukuje jedno słowo przed wzorca, wówczas rzeczywista Word, a następnie jednym słowem po wzoru:
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/'
hey there how
Dobra odpowiedź dla małych ilości danych, ale zaczyna się robić powoli, gdy pasujesz do> 100 znaków - np. w moim gigantycznym pliku xml chcę {1.200} przed i po, i jest on zbyt wolny w użyciu. – Benubird
Wersja awk autorstwa @amit_g jest znacznie szybsza. – ssobczak
Niedostępne w systemie Mac OSX, więc tak naprawdę nie jest to rozwiązanie powszechnie dostępne. Wersja -E (wymieniona poniżej) jest lepszym rozwiązaniem. Co to jest -P? Czytaj dalej ... -P, --perl-regexp Interpretacja PATTERN jako wyrażenia regularnego Perla (PCRE, patrz poniżej). Jest to wysoce eksperymentalne i grep -P może ostrzegać o niezatwierdzonych funkcjach. – Xofo