3

i want to grab the the text between tok98 and 5678 and dump that out to a file.

if the tok98 and the 5678 was on the same line i can use this

sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' testfile.txt > text.dmp

but when the tokens are vertically spaced its not working, how can i rewrite this sed to work here

$ cat testfile.txt
do with > 9
tok98
  fdf  df s df sd f sd v
  dvsdv  dvf sd vs vs dv  sdfsd

    2323 2323  232 {}   
   sfdf sd  f s df s df  sf 
5678
no way = true + 50

$
Darkmage
  • 323
  • 3
  • 12

2 Answers2

6

You can use /START/,/STOP/ pattern ranges in sed

sed -n '/tok98/,/5678/p' file

/START/ and /STOP/ can be REs too

sed -n '/^tok98/,/^5678/p' file

would print between the lines starting tok98 and 5678 and would not start or stop unless the lines begin with those strings.

If you want to exclude the /START/ and /STOP/ then this should work

sed -n '/^tok98/,/^5678/ {/^tok98/b;/^5678/b;p}' file
user9517
  • 115,471
  • 20
  • 215
  • 297
5

sed by default does not process multiple lines, but this can be solved using a trick like:

$ cat testfile.txt | tr '\n' ',' | sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' | tr ',' '\n' > text.dmp

You just need to convert the newlines \n to some other character like , and then convert them back to \n when done with sed. You need to make sure that you input file does not have any comma.

Khaled
  • 36,533
  • 8
  • 72
  • 99