#1 Le 11/07/2023, à 13: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, à 15: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, à 15: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! )
Dernière modification par Watael (Le 11/07/2023, à 15:26)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 12/07/2023, à 11: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, à 14:48)
Hors ligne
#5 Le 12/07/2023, à 16: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é".
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, à 16:49)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 13/07/2023, à 14: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