web-dev-qa-db-fra.com

Extraire la ligne commençant par un motif spécifique dans sed

Mon fichier d'entrée est comme ça:

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

J'utilise sed pour extraire tous les IDno et le type uniquement lorsque le type est student.

sed -e '/IDno=/b' -e '/Type=Student/b' d

Cela me donne toutes les lignes avec le type student mais pas le IDnos.

Je veux obtenir

IDno="1"
Type=Student
IDno="2"

mais j'obtiens

Type=Student

Qu'est-ce que je fais mal?

3
user110327

egrep peut obtenir plusieurs lignes d'un fichier. En utilisant un tuyau | comme séparateur, vous pouvez extraire autant de critères que vous le souhaitez. egrep est l'équivalent de grep -E. egrep est un script trouvé dans le dossier /bin avec le contenu pointant vers exec grep -E "$@".

Exemple:

egrep "IDno=|Type=Student" inputfile

ou

grep -E "IDno=|Type=Student" inputfile

Devrait-il produire:

IDno="1"
Type=Student
IDno="2"

J'espère que cela t'aides!

4
Terrance

Avec sed, pour imprimer des lignes spécifiques, il est plus facile d'utiliser l'option -n et la commande p:

sed -rn '/IDno=|Type=Student/p'

Ou:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

L'option -n supprime la sortie sauf si explicitement imprimée. La commande p imprime bien sûr les lignes correspondantes.

4
muru
  • awk:

    Définissez le séparateur de champ sur = et imprimez les enregistrements contenant Type=Student en tant qu'enregistrement complet ou IDno en tant que premier champ:

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • Perl:

    Imprimer les lignes commençant par IDno suivi de = ou par Type, suivi d'un = et se terminant par Student:

    Perl -ne 'print if /^(IDno=|Type=Student$)/'
    

Exemple:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% Perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
3
heemayl

La question initiale semble demander "pour extraire tous les IDno et le type niquement lorsque type est student." Mais l'exemple la sortie renvoie toutes les lignes IDno =, ce qui est plutôt contradictoire ...

Voici une réponse qui renvoie uniquement les IDno et Type lorsque Type = Student.

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

Une petite explication:

  • -n, --quiet, --silent supprime l'impression automatique de l'espace de motif
  • N;N; Lire/ajouter la ligne d'entrée suivante dans l'espace modèle. (deux fois)
  • /IDno=.*Type=Student/p recherche et impression de IDno = à Type = Student
  • | grep -v "^Name=" ne pas afficher le nom = ligne

Je n'aime pas sed | grep, mais je ne sais pas trop comment faire pour que Sed recherche à nouveau sa sortie, et un tuyau indique généralement "prend cette sortie et fait quelque chose" ... Peut aussi faire grep | sed

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'
0
Xen2050