J'essaie d'exécuter un script bash qui supprime les lignes d'un fichier avec uniquement la chaîne spécifique que je lui passe, " /home/ken/sed.txt strong > ". Script actuel qui ne fait rien: Ceci supprime toutes les lignes: Le fichier: p > Résultat souhaité: Toute aide serait grandement appréciée. 1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt
1 1 1 1 1 /home/ken/sed.txt
6 6 6 6 6 /home/ken/sed.txt
2 2 2 2 2 /home/ken/sed.txt
6 6 6 6 6 /home/ken/sed.txt
3 3 3 3 3 /home/ken/sed.txt
3 3 3 3 3 /home/ken/sed.txt
5 5 5 5 5 /home/ken/sed.txt
1 1 1 1 1 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
2 2 2 2 2 a/home/ken/sed.txt
6 6 6 6 6 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
3 3 3 3 3 a/home/ken/sed.txt
5 5 5 5 5 a/home/ken/sed.txt
#!/bin/bash
script="\\/home\\/ken\\/sed.txt"
sed -i "/$script/d" /home/ken/sed.txt
#!/bin/bash
script="\\/home\\/ken\\/sed.txt"
sed -i "/\<$script\>/d" /home/ken/sed.txt
3 Réponses :
1 1 1 1 1 a/home/ken/sed.txt 6 6 6 6 6 a/home/ken/sed.txt 2 2 2 2 2 a/home/ken/sed.txt 6 6 6 6 6 a/home/ken/sed.txt 3 3 3 3 3 a/home/ken/sed.txt 3 3 3 3 3 a/home/ken/sed.txt 5 5 5 5 5 a/home/ken/sed.txt
Cela "fonctionne" en ce sens qu'il crée un nouveau fichier avec le résultat souhaité - je voudrais qu'il édite le fichier actuel. Le remplacement de -n par -ni ou simplement -i ne fonctionne toujours pas
Avec GNU sed: Si vous voulez éditer votre fichier "sur place" ajoutez l'option -i
. Avec un sed non GNU, essayez -i ''
.
-i ne fonctionne pas. Il ajoute la "sortie souhaitée" à la fin de sed.txt edit: attendez, attendez.
Annulez cela - il semble que l'ordre des options soit important. La bonne manière est -ni. J'avais -in. Donc: sed -ni "\ | \ b $ script | p" /home/ken/sed.txt
Merci!
@soulkingbrook -in
utilisera n
comme extension de sauvegarde. Recherchez un fichier /home/ken/sed.txtn
.
Pourquoi sed est-il nécessaire? Je pense que vous pouvez simplement grep avec les options "--fixed-strings" et "--invert-match":
$ fgrep -v ' /home/ken/sed.txt' file.txt 1 1 1 1 1 a/home/ken/sed.txt 6 6 6 6 6 a/home/ken/sed.txt 2 2 2 2 2 a/home/ken/sed.txt 6 6 6 6 6 a/home/ken/sed.txt 3 3 3 3 3 a/home/ken/sed.txt 3 3 3 3 3 a/home/ken/sed.txt 5 5 5 5 5 a/home/ken/sed.txt grep -F -v ' /home/ken/sed.txt' file.txt
Ou, avec GNU grep, grep -vw '/home/ken/sed.txt'
Comme d'habitude lorsque vous souhaitez éditer un fichier sur place, je recommande ed
sur sed -i
:
#!/bin/sh script=" /home/ken/sed.txt" ed -s sed.txt <<EOF g!$script!d w EOF
Notez l'ajout d'un espace dans votre variable $ script
, pour éviter de faire correspondre les lignes a / home / ken / sed.txt
. Sans cela, chaque ligne de votre fichier d'exemple est supprimée, comme vous l'avez vu.
N'abusez pas de la barre oblique inverse.
sed -e '\ @ / chemin / vers / match @ d'
Dans le cas idéal, il serait bien de spécifier exactement quels caractères feraient de
[char] /home/ken/sed.txt
une non-correspondance.