1
votes

supprimer les lignes qui contiennent la chaîne exacte dans le script bash avec sed

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:

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

Ceci supprime toutes les lignes:

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

Le fichier: p >

#!/bin/bash

script="\\/home\\/ken\\/sed.txt"

sed -i "/$script/d" /home/ken/sed.txt

Résultat souhaité:

#!/bin/bash

script="\\/home\\/ken\\/sed.txt"

sed -i "/\<$script\>/d" /home/ken/sed.txt

Toute aide serait grandement appréciée.


2 commentaires

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.


3 Réponses :


4
votes
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

5 commentaires

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 .



0
votes

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


1 commentaires

Ou, avec GNU grep, grep -vw '/home/ken/sed.txt'



1
votes

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.


0 commentaires