sed - comment supprimer toutes les lignes qui ne correspondent pas

12

J'ai un fichier html. Je souhaite supprimer toutes les lignes qui ne commencent pas par <tr>.

J'ai essayé:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

mais il a supprimé toutes les lignes.

Michael Durrant
la source
3
Plus facile avec grep.
jcbermu du
1
s/^[^tr]...correspond aux lignes qui commencent par n'importe quel caractère autre que tou r. Les crochets sont une plage de caractères dans une expression régulière.
Peter Cordes

Réponses:

19

Essayez ceci avec GNU sed:

sed -n '/^<tr>/p' file

ou

sed '/^<tr>/!d' file
Cyrus
la source
1
Je trouve la version avec !dparticulièrement utile car elle vous permet d'écrire une autre commande sed dans l'expression, tandis que la pseule affiche la correspondance, mais la commande suivante a l'entrée non décochée.
jirislav
9
sed -e '/^<tr>/d'

La partie entre /est une expression régulière. La dcommande supprime les lignes correspondantes.

Mise à jour: oups, désolé d'avoir vu que vous avez dit NON. Donc

sed -e '/^<tr>/!d'

!nie le sens du match.

user3188445
la source
3

Si cela doit être sed:

sed -ni '/^<tr>/p' file

-iédite le fichier sur place, -nempêche sedd'imprimer toutes les lignes, l'expression régulière signifie faire correspondre toutes les lignes commençant par ( ^) <tr>et ces lignes seront imprimées ( p).

Avec grep:

grep -E '^<tr>' file

Avec -Egrep interprète les expressions régulières étendues.

Avec awk:

awk '/^<tr>/' file

Ou pur bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

L' [[expression conditionnelle interne de is bashs. Nous comparons $lavec l'expression régulière et si elle réussit ( &&) nous imprimons la ligne avec echo.

le chaos
la source
Votre version pure-bash ne cite pas "$l". Et vous le mettez comme premier argument sur echola ligne de commande de, donc vous aurez un problème s'il commence par un -option. (Utilisez printf '%s\n' "$l"). Also, shell read` pour lire un octet à la fois, donc c'est super lent. Le traitement des fichiers texte en bash pur n'est généralement pas un bon choix sauf si vous savez que votre fichier est très petit.
Peter Cordes
2

La réponse la plus simple et la plus simple serait:

grep '^<tr>' path/to/file 

Cela imprimera le fichier avec uniquement les lignes commençant par ce qui pourrait être bon si vous ne souhaitez pas modifier le fichier directement (comme avec sed).

Ensuite, si vous aimez ce que vous voyez dans la sortie, vous pouvez simplement imprimer dans un fichier avec > file

Dans ce cas, vous gagnez du temps en sauvegardant votre fichier avant d'essayer certaines commandes.

VaTo
la source