Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/07/2023, à 14:23

eric4321

script qui permet la suppression d'une ligne avec motif + 2 lignes

Bonjour,
Je réalise un script où je cherche
dans un premier temps à supprimer une ligne avec un motif et deux lignes suivantes;
et dans un deuxième temps, à supprimer une ligne avec  un motif et deux lignes précédentes.

Avec la commande echo, je parviens à voir les lignes choisies apparaître, pourtant, le script supprime tout le texte, ce qui ne devrait pas être le cas.
La premier commande sed aboutie au résultat attendue hors le deuxième commande
ci-après

sed -i "2,/$ligne/{N;N;d;};/$ligne/d" $fichier3 

ne fonctionne pas, pourtant, elle semble correcte;

Voici la partie du script qui pose problème :

while IFS= read -r ligne || [[ -n $ligne ]] ; do {
        for nom in "${noms[@]}"; do {
                if [[ $ligne == *"$nom"* ]]; then {
                        echo $ligne
                        sed -i "/$ligne/,+2d" $fichier3
                break
                }
                fi
        }
        done

        for mark in "${marks[@]}"; do {
                if [[ $ligne == *"$mark"* ]]; then {
                        echo $ligne
                        sed -i "2,/$ligne/{N;N;d;};/$ligne/d" $fichier3
                break
                }
                fi
        }
        done
}
done < "$fichier3"

Merci d'avance, pour l'aide fournie.

Hors ligne

#2 Le 11/07/2023, à 16:14

pingouinux

Re : script qui permet la suppression d'une ligne avec motif + 2 lignes

Bonjour,
Voici une façon de faire :

$ cat fichier
deb lig1 fin
deb lig2 fin
deb lig3 fin
deb lig4 fin
deb lig5 fin
deb lig6 fin
deb lig7 fin
deb lig8 fin

Suppression de la ligne du motif (ici, motif=lig4) et les 2 suivantes :

$ sed -zr 's/[^\n]*lig4[^\n]*\n([^\n]*\n){2}//' fichier
deb lig1 fin
deb lig2 fin
deb lig3 fin
deb lig7 fin
deb lig8 fin

Suppression de la ligne du motif (ici, motif=lig4) et les 2 précédentes :

$ sed -zr 's/([^\n]*\n){2}[^\n]*lig4[^\n]*\n//' fichier
deb lig1 fin
deb lig5 fin
deb lig6 fin
deb lig7 fin
deb lig8 fin

Hors ligne

#3 Le 11/07/2023, à 16:24

Watael

Re : script qui permet la suppression d'une ligne avec motif + 2 lignes

les accolades ne servent à rien dans le code shell (après do et then).

plutôt que des if, est-ce que je ne ferais pas un

readarray -t noms < <((grep "$(IFS='|'; echo "${noms[*]})" fichier3)

pareil avec marks
et donc, plus de boucle while, et  plus de if, plus de break ! \o/

pour ton souci, utilise l'option -z de sed pour supprimer deux \n avant le motif de recherche.  (grilled! big_smile)

Dernière modification par Watael (Le 11/07/2023, à 16:26)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 12/07/2023, à 12:25

eric4321

Re : script qui permet la suppression d'une ligne avec motif + 2 lignes

Merci à Pingouinux et  Watael, au final j'ai trouvé mon erreur sur le script mais je n'ai pas manqué de tester vos solutions même si j'avoue avoir été un peu dépassé par l'emploi de readarray dans ce cas.

L'erreur se situait ici

sed -i "2,/$ligne/d" $fichier3

"retirer les lignes précédentes"

J'ai enlevé les accolades. ça fonctionne très bien ^^

Dernière modification par eric4321 (Le 12/07/2023, à 15:48)

Hors ligne

#5 Le 12/07/2023, à 17:47

Watael

Re : script qui permet la suppression d'une ligne avec motif + 2 lignes

l'intervalle que tu indiques dans cette commande signifie "à partir de la deuxième ligne du fichier" jusqu'à "ligne comportant $ligne", et pas "deux lignes avant le motif cherché". hmm

as-tu oublié les N ? auquel cas, les accolades sont indispensables pour que sed comprenne que toutes les commandes sont à appliquer à l'intervalle défini.

Dernière modification par Watael (Le 12/07/2023, à 17:49)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 13/07/2023, à 15:39

eric4321

Re : script qui permet la suppression d'une ligne avec motif + 2 lignes

Bonjour,
En effet, je me suis trompé. La commande ne fonctionnait pas pour la raison que je croyais.

Cette commande ne fonctionnement pas avec ma variable.

sed -zr 's/([^\n]*\n){2}[^\n]*lig4[^\n]*\n//' fichier

Comment faire fonctionner cette commande avec une variable.

De plus j'ai une autre problématique, je cherche à comparer des adresses ip ou Mac et :

list 
192.168.1.1
192.168.1.2
192.168.1.125

lorsque je supprimer 192.168.1.1
192.168.1.125 est supprimé avec

Pour N, j'ai cette commande :

sed '/MAC/{N;N;d;}'

qui a le même rôle que celle qui m'a induit en erreur.

Merci d'avance,

Hors ligne