sed Range Pattern and 2 lines before Start Pattern
Hi all,
I have been searching all over Google but I am unable to find a solution for a particular result that I am trying to achieve.
Consider the following input:
I would like to extract 2 lines (these 2 lines can be different) above "Srt" (fixed) till "End"(fixed).
Desired output:
I understand that using the sed range pattern can help me on this.
However, the challenge that I am facing is that only "Srt" is fixed while the two lines above "Srt" always change, therefore I am unable to use them as a pattern. How do I modify the sed command such that I can include the two lines above "Srt", somewhat like grep -B2?
Please help on this.
Last edited by Don Cragun; 11-12-2015 at 05:25 AM..
Reason: Add CODE and ICODE tags.
With sed -n, nothing is printed unless you explicitly ask for it to be printed. Because you didn't anchor the search for Srt to the start of a line and the two lines before the line that just contains the string Srt also contain the string Srtin both cases, your sed command produces the output you want if you add a p flag to the command you showed us:
Does it have to be sed? If the lines before the line just containing:
can contain arbitrary text not including Srt, this is easier with ed or ex:
Actually the Sample Input was made up arbitrarily by me. It does not necessarily contain the string "Srt". Therefore the sed command, which I was trying should not work.
With regards to your suggestion of using "ed" command, that is just perfect and what I was looking for. To be honest, I didn't know this command even existed...though I know it does now. I'll look into the man page of "ed" now.
I'll try to play around with it for now.
Thanks a lot for the quick assistance Don! Really appreciate it!
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 2,288
Thanks Given: 430
Thanked 480 Times in 395 Posts
Hi.
See also non-standard utilty cgrep, which can poduce combinations to obtain the window desired:
producing:
One difference between the solutions is that cgrep will not copy the entire file to a scratch file as will many versions of ed, but rather keep just enough to perform the window task. However, for small files that is not significant.
One will probably need to compile the cgrep code (it compiled easily in 32 and 64-bit with gcc). This is an obvious downside if one is not experienced. However, cgrep is a very fast code, as fast as grep. Here are top few codes for searching a 1,777,700 line file with 1100 matches:
The utility gogrep is a searching code written in language go: https://sift-tool.org/
I have a file like below.
2018.07.01, Sunday
09:27 some text 123456789 0 21 0.06 0.07 0.00
2018.07.02, Monday
09:31 some text 123456789 1 41 0.26 0.32 0.00
09:39 some text 456789012 1 0.07 0.09 0.09
09:45 some text 932469494 1 55 0.29 0.36 0.00
16:49 some text 123456789 0 48 0.12 0.15 0.00... (9 Replies)
The intended result should be :
PDF converters
'empty line'
gpdftext and pdftotext?xml version="1.0"?>
xml:space="preserve"><note-content version="0.1" xmlns:/tomboy/link" xmlns:size="http://beatniksoftware.com/tomboy/size">PDF converters
gpdftext and pdftotext</note-content>... (9 Replies)
'Hi
I'm using the following code to extract the lines(and redirect them to a txt file) after the pattern match. But the output is inclusive of the line with pattern match.
Which option is to be used to exclude the line containing the pattern?
sed -n '/Conn.*User/,$p' > consumers.txt (11 Replies)
Hi,
I have a file as below
This is the line one
This is the line two
<\XMLTAG>
This is the line three
This is the line four
<\XMLTAG>
Output of the SED command need to be as below.
This is the line one
This is the line two
<\XMLTAG>
Please do the need to needful to... (4 Replies)
Hello sed gurus. I am using ksh on Sun and have a file created by concatenating several other files. All files contain header rows. I just need to keep the first occurrence and remove all other header rows.
header for file
1111
2222
3333
header for file
1111
2222
3333
header for file... (8 Replies)
Hi,
My input has much more lines, but few of them are below
pin(IDF) {
direction : input;
drc_pinsigtype : signal;
pin(SELDIV6) {
direction : input;
drc_pinsigtype : ... (3 Replies)
I've a file say having
line 1
line 2
(NP
line 3
line 4
line 5)
line 6
I want to combine lines starting from (NP and ending with ) then it will look like
line 1
line 2
(NP line3 line4 line5)
line 6
I tried using sed '/(NP/,/)$/ s/\n/ /' but it's not working. Any help please?
... (8 Replies)
Hi guys, trying to replace a '#' with a ' ' (space) but only between the brackets '(' and ')'
N="text1#text2#text3(var1#var2#var3)"
N=`echo $N |sed '/(/,/) s/#. //'`
echo $N
Looking for an output of "text1#text2#text3(var1 var2 var3)"
Any ideas? (15 Replies)
This is my first post, please be nice. I have tried to google and read different tutorials.
The task at hand is:
Input file input.txt (example)
abc123defhij-E-1234jslo
456ujs-W-abXjklp
From this file the task is to grep the -E- and -W- strings that are unique and write a new file... (5 Replies)
Hi all,
I am using sed for extracting the lines that occurs between the 2 patterns using the following command:
sed -n '/pattern1/,/pattern2/' filename
The above command has no problem and works fine. But I was wondering if there is a way to quit sed when it has extracted the range at... (3 Replies)