2

So I've found a great deal on deleting the text between two patterns and on printing the text between two delimiters but I haven't found anything on printing the text between two patterns using bash functions.

If I have:

"Alas poor Yorik, I knew him well"

and I want to print everything between the patterns "poor" and "well" (exclusive) I would get:

" Yorik, I knew him "

How could I achieve this using something like sed or awk?

Community
  • 1
  • 1
Ocasta Eshu
  • 841
  • 3
  • 11
  • 23

1 Answers1

5
dtpwmbp:~ pwadas$ echo "Alas poor Yorik, I knew him well" | sed -e 's/^.*poor //g;s/ well.*$//g'
Yorik, I knew him
dtpwmbp:~ pwadas$ echo "Alas poor Yorik, I knew him well" | awk '{sub(/.*poor /,"");sub(/ well.*/,"");print;}'
Yorik, I knew him

Usage with file input:

dtpwmbp:~ pwadas$ echo "Alas poor Yorik, I knew him well" > infile
dtpwmbp:~ pwadas$ cat infile 
Alas poor Yorik, I knew him well
dtpwmbp:~ pwadas$ cat infile | sed -e 's/^.*poor //g;s/ well.*$//g'
Yorik, I knew him
dtpwmbp:~ pwadas$ sed -e 's/^.*poor //g;s/ well.*$//g' < infile
Yorik, I knew him
dtpwmbp:~ pwadas$ cat infile | awk '{sub(/.*poor /,"");sub(/ well.*/,"");print;}'
Yorik, I knew him
dtpwmbp:~ pwadas$ awk '{sub(/.*poor /,"");sub(/ well.*/,"");print;}' < infile 
Yorik, I knew him
Piotr Wadas
  • 1,838
  • 1
  • 10
  • 13
  • 1
    Actually it's matter of regular expression you use, in some cases bracket expression (.*poor)(.*)(well.*) or similar, and backreference - /2 in this example, would be more readable, anyway the trick is to use regex definition(s). – Piotr Wadas Sep 15 '12 at 23:19
  • updated with file input usage – Piotr Wadas Sep 16 '12 at 18:48
  • 1
    I recommend you this book http://docstore.mik.ua/orelly/unix/upt/index.htm as well as this one http://docstore.mik.ua/orelly/unix/sedawk/index.htm – Piotr Wadas Sep 16 '12 at 18:50