Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

350
Visualizações
Linux - Delete all lines from a given line number

I am trying to delete a file's contents from a supplied line number using sed. The problem is that sed isn't accepting the variable I supply to it

line_num=$(grep -n "debited" file.csv | sed -n '2 s/:.*//p') && sed -i.bak "$line_num,$d" file.csv

The idea is to delete all lines from a file after & including the second occurence of the pattern.

I'm not stubborn with sed. Awk & perl could do too.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Seems like you want to delete the rest of the file after a second showing of a pattern (debited), including that line.

Then can truncate it, ising tell for the length of what's been read up to that line

perl -e'while (<>) { 
    if ( ($cnt += /debited/) == 2 ) { truncate $ARGV, $len; exit } 
    $len = tell;
}' file

Here the $ARGV variable has the "current" file (when reading from <>). Feel free to introduce a variable with the pattern instead of the literal (debited), based on your context.

This can be made to look far nicer in a little script but it seems that a command-line program ("one-liner") is needed in the question.

over 4 years ago · Santiago Trujillo Relatório

0

you're doing lot's of unnecessary steps, this will do what you want.

$ awk '/debited/{c++} c==2{exit}1' file

delete second occurrence of the pattern and everything after it.

To replace the original file (and create backup)

$ awk ... file > t && mv -b --suffix=.bak t file
over 4 years ago · Santiago Trujillo Relatório

0

I always suggest ed for editing files over trying to use sed to do it; a program intended from the beginning to work with a file instead of a stream of lines just works better for most tasks.

The idea is to delete all lines from a file after & including the second occurence[sic] of the pattern

Example:

$ cat demo.txt
a
b
c
debited 12
d
e
debited 14
f
g
h
$ printf "%s\n" '/debited/;//,$d' w | ed -s demo.txt
$ cat demo.txt
a
b
c
debited 12
d
e

The ed command /pattern/;//,$d first sets the current line cursor to the first one that matches the basic regular expression pattern, then moves it to the next match of the pattern and deletes everything from there to the end of the file. Then w writes the changed file back to disk.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda