Deleting all lines after first occurrence of a string in a line
7,601
sed '/something interesting/,$d' < file > newfile
Which can be optimized to:
sed -n '/something interesting/q;p' < file > newfile
for sed
to quit as soon as it finds the pattern.
Which with the GNU implementation of sed
, as noted by @RakeshSharma, can be simplified to
sed '/something interesting/Q' < file > newfile
To truncate the file in-place, with ksh93
instead of bash
, you could do:
printf '' <>; file >#'*something interesting*'
-
<>;
is like the standard<>
redirection operator (open in read+write) except that the file is truncated at the end if the command is successful. -
<#pattern
seeks to the start of the next line matching the pattern.
(note that it seems to work (with ksh93u+ at least) with printf ''
on stdout but not with some other builtin commands like true
, :
or eval
. Looks like a bug. Also it can't be the last command of a script (another bug)).
Related videos on Youtube
Comments
-
rubo77 over 1 year
I have a large file
test.txt
like this example:foo before ... before some line foo something interesting bar after some lines after ... bar
How do I create a new file with just the lines before the first occurrence of the string "
something interesting
" with basic bash commands likesed
orgrep
(notawk
, I need this on an embedded device without awk)?-
Admin almost 7 yearsA slight nitpick (and clarification).
sed
andgrep
are notbash
commands; they are separate commands, which can be invoked from any shell you happen to be using. -
Admin almost 7 years
-
-
Stéphane Chazelas almost 7 years@RakeshSharma, good point. I've added it
-
pa4080 over 5 yearsThe first suggestion works perfectly, thanks. I spent some time to realize how to use it wit shell variable expansion:
sed "/${VAR}/,$ d"
- note the white space between$
andd
. -
Sadi about 3 yearsAnd the GNU sed command to edit in place would simply be
sed -i '/something interesting/Q' 'file'