web-dev-qa-db-fra.com

Comment supprimer des lignes d'un fichier jusqu'à un motif spécifique?

Je dois rechercher le numéro de ligne d'une correspondance spécifique dans un fichier (adresse électronique), puis le supprimer du début du fichier jusqu'à la ligne correspondante.

par exemple Disons que le numéro de ligne est 13807 . Il faut donc que les lignes 13808 + soient intactes.

Voici un exemple:

$ cat input
some
lines
before
[email protected]
and
some
more
afterwards

$ cat output
and
some
more
afterwards
4
Kevin Andrews

sed

sed '1,/mail@server\.com/d'  # excluding the matched line
sed '/mail@server\.com/,$!d' # including the matched line

Des explications

  • 1,/mail@server\.com/d - delete toutes les lignes de la ligne 1 à (,) [email protected]
  • /mail@server\.com/,$!d - ne pas (!) delete toutes les lignes de [email protected] à (,) à la fin du fichier ($), mais tout le reste

Usage

sed '…' file > file2 # save output in file2
sed -i.bak '…' file  # alter file in-place saving a backup as file.bak
sed -i '…' file      # alter file in-place without backup (caution!)

awk

awk 'f;/mail@server\.com/{f=1}' # excluding the matched line
awk '/mail@server\.com/{f=1}f'  # including the matched line

Des explications

  • f - variable f, les variables sont 0 = false par défaut, awk n'imprime rien si l'expression est false et n'imprime que la ligne si l'expression est true
  • /mail@server\.com/{f=1} - si [email protected] est trouvé, définissez f=1, le rendu de l'expression entière true la prochaine fois que f se produira dans l'expression

Usage

awk '…' file > file2                          # save output in file2
awk -iinplace -vINPLACE_SUFFIX=.bak '…' file  # alter file in-place saving a backup as file.bak
awk -iinplace '…' file                        # alter file in-place without backup (caution!)
10
dessert

Une autre awk approche, y compris la ligne correspondante.

awk '/pattern/, 0' infile

À l'exclusion de la ligne correspondante.

awk '/pattern/&& getline, 0' infile
2
αғsнιη