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)).

Share:
7,601

Related videos on Youtube

rubo77
Author by

rubo77

SCHWUPPS-DI-WUPPS

Updated on September 18, 2022

Comments

  • rubo77
    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 like sed or grep (not awk, I need this on an embedded device without awk)?

    • Admin
      Admin almost 7 years
      A slight nitpick (and clarification). sed and grep are not bash commands; they are separate commands, which can be invoked from any shell you happen to be using.
    • Admin
      Admin almost 7 years
  • Stéphane Chazelas
    Stéphane Chazelas almost 7 years
    @RakeshSharma, good point. I've added it
  • pa4080
    pa4080 over 5 years
    The 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 $ and d.
  • Sadi
    Sadi about 3 years
    And the GNU sed command to edit in place would simply be sed -i '/something interesting/Q' 'file'