3 votes

Recherche et suppression des lignes correspondant à un modèle avec les commentaires de la ligne précédente s'il y en a.

J'ai un besoin d'écrire un Shell Shell en csh pour rechercher et supprimer les lignes correspondant à un modèle ainsi que les commentaires de la ligne précédente s'il y en a. Par exemple, si mon fichier contient les lignes suivantes

Shell script
#this is  a test
pattern1
format1
pattern2
format2
#format3
pattern3

Si le motif de recherche est "motif", la sortie devrait être la suivante

Shell script
format1
format2

Pour être plus précis, il faut supprimer les lignes qui contiennent le motif et la ligne précédente si elle commence par "#".

Merci pour votre aide

0voto

jason saldo Points 5036

Tout d'abord personne ne devrait jamais utiliser csh pour quoi que ce soit - il est obsolète et non (pas "sous") alimenté. Deuxièmement, je doute qu'il soit à la hauteur de la tâche. Troisièmement, il est beaucoup plus probable que awk , sed ou même Perl sera un bien meilleur outil pour cette tâche.

awk '/^#/ {printf line; line=$0"\n"; next} /pattern/ {line=""} ! /pattern/ {printf line; print; line=""}'

Edit : corrigé script pour gérer correctement les lignes de commentaires

0voto

Kyle Brandt Points 81077

Il y a probablement une meilleure façon d'écrire ça logiquement, mais je pense que ça pourrait le faire :

#!/usr/bin/perl
use strict;
use warnings;

my $previous_line = '';
while(<>) {
    if ( /pattern/ ) {
        if ( (! ($previous_line =~ /^#/)) && (! ($previous_line =~ /pattern/))) {
            print $previous_line;
        }
    } elsif (! ($previous_line =~ /pattern/)) {
        print $previous_line;
    }
    $previous_line = $_;
}
print $previous_line if not ($previous_line =~ /pattern/);

Fondamentalement, la boucle est une ligne derrière la ligne précédente. Elle dit qu'il est possible d'imprimer le ligne précédente si :

  1. Si la ligne courante correspond au motif : Il est possible d'imprimer la ligne précédente à condition qu'elle ne corresponde pas au modèle ou qu'il s'agisse d'un commentaire.
  2. Si cette ligne n'est pas un modèle, elle est d'imprimer la ligne précédente tant qu'elle tant qu'elle ne correspond pas au motif.

Vous pouvez simplement enregistrer le code dans un fichier et l'utiliser comme suit : perl thefile.pl textfile_you_want_to_filter

0voto

pts Points 415

Voici une solution en une ligne en Perl (pas en C Shell). Vous pouvez modifier le /pattern/ expression régulière au milieu.

perl -ne 'if(/^#/){$c=$_}elsif(!/pattern/){print$c,$_;$c=""}else{$c=""}' <file.in

0voto

Salamander2007 Points 2242

Doit-il s'agir d'un script Shell ?

  1. ouvrir un fichier avec vi
  2. :g/<pattern>/d
  3. Répétez l'opération si nécessaire pour d'autres supplémentaires, à moins que vous ne puissiez regexer le motif
  4. :g/^#/d

peut être efficacement reproduit en utilisant sed s'il doit être scripté

éditer :

1.créer un fichier .sedscript :

/pattern/d
/^#/d

2. sed -f .sedscript <inputfile> > <outputfile>

Cela ne répond pas à l'obligation de supprimer la ligne précédente, mais votre exemple ne semble pas nécessiter cette fonctionnalité.

0voto

jason saldo Points 5036

Voici un sed version. Certaines versions de sed Il se peut que certaines parties de ce document doivent être séparées en plusieurs -e clauses.

sed '$b;N;/^#.*\npattern.*$/ ! {P;D}; :c; $d; s/.*\n//;N;/^#.*\npattern.*$/ {bc}; /^pattern/d; D' patterns

Voici une version en fichier script de ce one-liner avec des commentaires :

#!/bin/sed -f

# Search for a combination of a comment followed by a pattern
# until that, print what you find.
$b
N
/^#.*\npattern.*$/ ! {
P
D
}

:c
# Got a comment and a pattern combination in pattern space.
# At the end of the file we simply exit
$d

# Else, we keep reading lines with `N' until we
# find a different one
s/.*\n//
N
/^#.*\npattern.*$/ {
bc
}

# Remove standalone lines that have "pattern"
/^pattern/d

# Remove the last instance of the combination
# and go back to the top
D

Ceci est basé sur le script dans info sed section 4.16 "Supprimer toutes les lignes dupliquées" (uniq -u).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X