J'ai un fichier qui contient les lignes suivantes.
**;**;**;
*(Eng_Sen:This is an Apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
Je souhaite supprimer toutes les lignes contenant les motifs suivants à l'aide de la commande Sed.
**;**;**;
**;**;**
Aidez-moi, s'il vous plaît. Merci.
sed '/\*\*;\*\*;\*\*;\?/d' file
\*\*;\*\*;\*\*;\?
: correspond à une chaîne **;**;**
éventuellement suivie d'un caractère ;
;d
: supprime la ligne.Pour éditer le fichier en place:
sed -i '/\*\*;\*\*;\*\*;\?/d' file
% cat file :(
**;**;**;
*(Eng_Sen:This is an Apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
% sed '/\*\*;\*\*;\*\*;\?/d' file
*(Eng_Sen:This is an Apple)*;*(WordID:1 2 3 4)*;*(message:)*;
%
Plus généralement, pour supprimer toute ligne ne contenant que des points-virgules et des astérisques:
sed '/^[*;]\+$/d'
Bien que vous n'ayez pas besoin de vous limiter à sed:
grep -Ev '^[*;]+$'
la réponse de Kos fait déjà le travail. Ma réponse améliore seulement quelque peu la regex.
En utilisant le modèle de regroupement \( \)
et le .\+
échappé, nous pouvons lui indiquer de faire correspondre le groupe entier **;
et tout ce qui est suivi. Dans cet exemple, j'utilise
$ sed -e "s|\(\*\*;\).\+|TEST|g" stars.txt
TEST
*(Eng_Sen:This is an Apple)TEST
TEST
TEST
*(Eng_Sen:This is an Apple)TEST
TEST
Notez que la version GNU sed
peut prendre n'importe quel caractère comme séparateur dans la commande de substitution, pas seulement /
. Ici, j'utilisais une barre verticale.
Dans l'exemple ci-dessus, j'ai pris la liberté d'augmenter l'exemple du PO de 3 à 6 lignes.
$ cat stars.txt
**;**;**;
*(Eng_Sen:This is an Apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
**;**;**;
*(Eng_Sen:This is an Apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
Vous pouvez utiliser Vim en mode Ex:
ex -sc 'g/\*\*/d' -cx file
g
recherche globale
d
delete
x
enregistrer et fermer