How to delete all lines before a particular pattern when the pattern is defined in a variable?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to delete all lines before a particular pattern when the pattern is defined in a variable?
# 15  
Old 09-26-2017
May not be the most efficient:
Code:
tac file | sed -n "/$var/q; p;" | tac
Line 4
Line 5


Last edited by RudiC; 09-26-2017 at 06:04 AM.. Reason: overread the request to use a variable.
This User Gave Thanks to RudiC For This Post:
# 16  
Old 09-26-2017
Just for fun (with gnu awk) :
Code:
$ XX="Line 1"
$ awk  'BEGIN{X=0;ARGV[ARGC++]=ARGV[ARGC-1]}FNR==NR && /'"$XX"'/ {X=FNR} FNR !=NR && FNR > X' file
Line 4
Line 5

Work as Corona688's idea.
Regards.
# 17  
Old 09-26-2017
As a very different approach, how about:-
Code:
Req_Line="^Line 1 "                   # Note the leading carat to anchor to begginning of line (if that's what you want) and the trailing space to avoid matching Line 11
                                      # This is used as an Extended Regular Expression, so you can adjust this to suit your needs

IFS=":" read lastline rest < <(grep -En "$Req_Line" filename |tail -1)
((lastline=$lastline+1))

sed -n "$lastline,\$p" filename

For a large file, this has the overhead of perhaps reading the file twice, so you would have to trial it for performance.

It would be sensible to add some error checking, such as what to do if the expression does not match. As it is, this would display the whole file, which might not be what you want.



I hope that this helps, or at least gives an alternate.
Robin
This User Gave Thanks to rbatte1 For This Post:
# 18  
Old 09-26-2017
Hi.
Quote:
Originally Posted by RudiC
May not be the most efficient:
Code:
tac file | sed -n "/$var/q; p;" | tac
Line 4
Line 5

Perhaps not the most efficient, but, in the absence of requirements from OP, it certainly is simple. I like simple ... cheers, drl
# 19  
Old 09-26-2017
Thanks all.

Disedorgue's 'just for fun' solution worked for me with nawk.
# 20  
Old 09-26-2017
This approach may be more efficient than others for large files and the pattern found towards the end of the file, as tac opens the file from the end (output of strace):
Code:
.
.
.
open("TMPFILE", O_RDONLY)               = 3
lseek(3, 0, SEEK_END)                   = 37790
.
.
.

and, if sed found the pattern and exits, it quits due to a broken pipe
Code:
.
.
.
write(1, "sr/bin/gpgsplit\n26696\t/usr/bin/g"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=14645, si_uid=1000} ---

NOT reading the entire input file.
# 21  
Old 09-26-2017
Hi.
Quote:
Originally Posted by RudiC
This approach may be more efficient than others for large files and the pattern found towards the end of the file, as tac opens the file from the end (output of strace):
Code:
.
.
.
open("TMPFILE", O_RDONLY)               = 3
lseek(3, 0, SEEK_END)                   = 37790
.
.
.

and, if sed found the pattern and exits, it quits due to a broken pipe
Code:
.
.
.
write(1, "sr/bin/gpgsplit\n26696\t/usr/bin/g"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=14645, si_uid=1000} ---

NOT reading the entire input file.
I took a quick look through tac.c\src - coreutils.git - GNU coreutils

The speed-up by seeking to end may be offset somewhat by:
1) In this situation tac is used twice,
2) There is a lot of manipulation going on, including RE matches in some cases,

If we are curious we'd benchmark it, of course Smilie

I still like the simplicity, however, regardless of what happens under the hood ... cheers, drl
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Delete duplicate like pattern lines

Hi I need to delete duplicate like pattern lines from a text file containing 2 duplicates only (one being subset of the other) using sed or awk preferably. Input: FM:Chicago:Development FM:Chicago:Development:Score SR:Cary:Testing:Testcases PM:Newyork:Scripting PM:Newyork:Scripting:Audit... (6 Replies)
Discussion started by: tech_frk
6 Replies

2. Shell Programming and Scripting

sed -- Find pattern -- print remainder -- plus lines up to pattern -- Minus pattern

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)
Discussion started by: Klasform
9 Replies

3. Shell Programming and Scripting

Delete lines and the first pattern between 2 matched patterns

Hi, i need help to delete all the lines between 2 matched patterns and the first pattern must be deleted too. sample as follows: inputfile.txt >kump_1 ........................... ........................... >start_0124 dgfhghgfh fgfdgfh fdgfdh >kump_2 ............................. (7 Replies)
Discussion started by: redse171
7 Replies

4. Shell Programming and Scripting

Print/delete the lines between two pattern.

Hello, I am having hard time figuring out how to print/delete the lines between two pattern. Here is the part of the file nastran1.bdf: RBE3 48729 32232 123456 0.30000 123 59786 59787 60114 RBE3 48732 1330 123 0.30000 123 10107... (4 Replies)
Discussion started by: dragomir
4 Replies

5. Shell Programming and Scripting

delete lines starting with a pattern

i have a file sample.txt containing i want to delete lines starting with 123 neglecting spaces and tabs. but not lines containing 123. i.e. i want files sample.txt as help me thanxx (4 Replies)
Discussion started by: yashwantkumar
4 Replies

6. Shell Programming and Scripting

sed pattern to delete lines containing a pattern, except the first occurance

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)
Discussion started by: gary_w
8 Replies

7. Shell Programming and Scripting

search the pattern in a file and replace with variable already defined previously in csh

I want to replace a certain pattern with the variable already defined. e.g. set path_verilog = /home/priya/bin/verilogfile my file contents are : verilog new verilog is defined here verilog_path_comes I am using the below command sed 's/verilog_path_comes/'$path_verilog'/g' <filename>... (2 Replies)
Discussion started by: nehashine
2 Replies

8. Shell Programming and Scripting

Delete Lines between the pattern

Hi All, Below is my requirement. Whatever coming in between ' ', needs to delete. Input File Contents: ============== This is nice 'boy' This 'is bad boy.' Got it Expected Output =========== This is nice This Got it (4 Replies)
Discussion started by: susau_79
4 Replies

9. Shell Programming and Scripting

delete lines in file matching a pattern

I have a text file, a sample of which is as follows: r/- * 0: WINDOWS/Microsoft.NET/Framework/v2.0.50727/ASP.NETWebAdminFiles/Images/headerGRADIENT_Tall.gif r/- * 0: WINDOWS/SoftwareDistribution/Download/cf8ec753e88561d2ddb53e183dc05c3e/backoff.jpg r/- * 0: ... (2 Replies)
Discussion started by: stumpyuk
2 Replies

10. UNIX for Dummies Questions & Answers

How to delete lines do NOT match a pattern

On Unix, it is easy to get those lines that match a pattern, by grep pattern file or those lines that do not, by grep -v pattern file but I am editing a file on Windows with Ultraedit. Ultraedit support regular expression based search and replace. I can delete all the lines that match a... (1 Reply)
Discussion started by: JumboGeng
1 Replies
Login or Register to Ask a Question