How do I delete all lines in a file starting from after a matching line?
If you don't want to print the matched line (or any following lines):
sed -n '/The second line/q;p' inputfile
This says "when you reach the line that matches the pattern quit, otherwise print each line". The -n
option prevents implicit printing and the p
command is required to explicitly print lines.
or
sed '/The second line/,$d' inputfile
This says "delete all lines from the output starting at the matched line and continuing to the end of the file".
but the first one is faster. However it will quit processing completely so if you have multiple files as arguments, the ones after the first matching file won't be processed. In this case, the delete form is better.
If you do want to print the matched line, but not any following lines:
sed '/The second line/q' inputfile
This says "print all lines and quit when the matched line is reached" (the -n
option (no implicit print) is not used).
See man sed for additional information.
How to delete from a text file, all lines that contain a specific string?
To remove the line and print the output to standard out:
sed '/pattern to match/d' ./infile
To directly modify the file – does not work with BSD sed:
sed -i '/pattern to match/d' ./infile
Same, but for BSD sed (Mac OS X and FreeBSD) – does not work with GNU sed:
sed -i '' '/pattern to match/d' ./infile
To directly modify the file (and create a backup) – works with BSD and GNU sed:
sed -i.bak '/pattern to match/d' ./infile
How to remove all lines after a line containing some string?
awk '{print} /fox/{exit}' file
With GNU sed:
sed '0,/fox/!d' file
or
sed -n '0,/fox/p' file
how to delete all the lines after a certain line in shell?
If you want to remove from the match of ^second line
to end of file, you will want to force an exit with q
after the match, e.g.
sed '/^second line/q' file
(you can add -i
to edit in-place)
Example Use/Output
With your lines in file:
$ sed '/^second line/q' file
first line
second line
Use sed to delete all lines starting with pattern b after line with pattern a
With GNU sed
, you may use
sed '/DELETE ME/{:a;N;s/\n[[:blank:]]*-.*//;ta;!P;D}' file
See the online sed
demo:
s='first line
second line DELETE ME
- third line
- fourth line
fifth line
sixth line DELETE ME
seventh line
- eighth line'
sed '/DELETE ME/{:a;N;s/\n[[:blank:]]*-.*//;ta;!P;D}' <<< "$s"
Output:
first line
fifth line
seventh line
- eighth line
Details
/DELETE ME/
- finds all lines that containDELETE ME
string{:a;N;s/\n[[:blank:]]*-.*//;ta;!P;D}
- if the line matchingDELETE ME
is found, this block is entered::a
- ana
label marks the current positionN
- reads the next line with\n
at the start into the pattern spaces/\n[[:blank:]]*-.*//
- finds and removes the newline, 0+ blank chars,-
and the rest of the stringta
- if the substitution occurred,sed
goes to the position marked witha
!P
- otherwise, prints the pattern space content until the first newline (i.e. prints the first line)D
- deletes the pattern space content until the first new line, i.e. deletes the first line inside pattern space, and restarts cycle with the resultant pattern space, without reading a new line of input.
Remove all lines before a match with sed
try this (GNU sed only):
sed '0,/^bin$/d'
..output is:
$sed '0,/^bin$/d' file
boot
...
sys
tmp
usr
var
vmlinuz
Delete all lines beginning with a # from a file
This can be done with a sed one-liner:
sed '/^#/d'
This says, "find all lines that start with # and delete them, leaving everything else."
How to delete all lines before the first and after the last occurrence of a string?
Could you please try following. Written and tested with shown samples with GNU awk
.
awk '
/Lecture/{
found=1
}
found && NF{
val=(val?val ORS:"")$0
}
END{
if(val){
match(val,/.*Lecture [0-9]+/)
print substr(val,RSTART,RLENGTH)
}
}' Input_file
Explanation: Adding detailed explanation for above.
awk ' ##Starting awk program from here.
/Lecture/{ ##Checking if a line has Lecture keyword then do following.
found=1 ##Setting found to 1 here.
}
found && NF{ ##Checking if found is SET and line is NOT NULL then do following.
val=(val?val ORS:"")$0 ##Creating va and keep adding its value in it.
}
END{ ##Starting END block of this code here.
if(val){ ##Checking condition if val is set then do following.
match(val,/.*Lecture [0-9]+/) ##Matching regex till Lecture digits in its value.
print substr(val,RSTART,RLENGTH) ##Printing sub string of matched values here to print only matched values.
}
}' Input_file ##Mentioning Input_file name here.
Delete all lines before first occurrence of specific string in file
With sed
you could use:
sed -i '/somestring/,$!d' file
Explanation of replace expressions:
,
matches lines starting from where the first
address matches, and continues until the second match
(inclusively).
$
matches the last line of the last file of input,
or the last line of each file when the -i or -s options are
specified.
!
If the character follows an address range, then only lines
which do not match the address range will be selected.
d
Delete the pattern space; immediately start next cycle.
Result:
$ sed -i '/somestring/,$!d' file
somestring
bats
car
somestring
bats
car
somestring
bats
car
Related Topics
How Would I Get a Cron Job to Run Every 30 Minutes
Command Line: Search and Replace in All Filenames Matched by Grep
Sending a Mail from a Linux Shell Script
Bash - How to Pipe Result from the Which Command to Cd
What's the Memory Before 0X08048000 Used for in 32 Bit MAChine
Docker Volume Not Mounting Any Files
Differencebetween -I and -L in Makefile
How Stable Is S3Fs to Mount an Amazon S3 Bucket as a Local Directory
Merge PDF's with PDFtk with Bookmarks
Default Field Separator for Awk
Bash: Inserting a Line in a File at a Specific Location
Why Doesn't Linux Use the Hardware Context Switch via the Tss
Difference Between Arm-Eabi Arm-Gnueabi and Gnueabi-Hf Compilers
Tar a Directory, But Don't Store Full Absolute Paths in the Archive