2009-11-19 12 views
1

Comment rechercher et supprimer une ligne (et non la remplacer) de plusieurs fichiers dans une arborescence de répertoires? J'ai essayé des programmes tels que grepWin et Windows Grep mais ils remplacent les lignes, ils ne suppriment pas toute la ligne. Quelle est ma meilleure option? Exemple: Recherchez "bonjour" et supprimez toute ligne avec "bonjour" dedans.Suppression de lignes de plusieurs fichiers

yo 
hello hey hey 
hi hello 
bye 
bye 

devrait revenir

yo 
bye 
bye 
+0

Marquage avec agnostic linguistique puisque vous n'avez pas spécifié une langue. N'hésitez pas à changer si la langue compte. – Mizipzor

+1

Marquage avec des fenêtres depuis que vous avez utilisé des outils Windows. N'hésitez pas à changer si la plateforme était un vrai système d'exploitation. –

Répondre

0

J'ai trouvé un moyen dans grepWin ou Windows Grep de le faire.

Regex Rechercher: ^. bonjour. $ \ r \ n Regex Remplacer:

(remplacez blanc)

0
 
perl -i.bak -ne 'print unless m/pattern/' file1 file2 file3 ... 
1
grep -R --revert-match 

pourrait fonctionner. Certaines versions de grep GNU prennent en charge la recherche récursive par masque de fichier, mais je ne suis pas sûr des ports Windows.

Plus long mais plus facile façon,

gfind . -name "*.txt" | xargs deleteLine.bat hello 

où gfind est GNU de trouver, par exemple, unxutils.sf.net et deleteLine.bat est comme:

grep %1 --revert-match %2 > tempfile.### 
move tempfile.### %2 
1

Si vous avez Cygwin, vous pouvez utiliser sed:

cat test.txt | sed 's/.*hello.*//' 

Cela supprimera les lignes avec bonjour, mais montrer les lignes vides. Si vous ne l'aimez pas les lignes blan, vous pouvez faire:

cat test.txt | sed 's/.*hello.*//' | sed '/^$/d' 

Edit: la réflexion, la chose complète peut être simplifiée comme:

sed '/.*hello.*/d' test.txt 

où test.txt est le fichier.

+0

Cela effacera également toutes les autres lignes vides. Vous pouvez placer un fichier dans sed avec <, sans utiliser 'cat'. –

1

Je suggère d'installer cygwin si vous ne l'avez pas déjà - il est plein d'outils pour faire des choses comme ça.

Vous pouvez supprimer des lignes avec sed:

sed -i '/pattern/d' filename... 

L'option -i indique à Sed de modifier le fichier en place. -i.bak laissera un fichier de sauvegarde avec une extension de .bak.

Pour traiter tous les fichiers de l'arborescence, je suggère d'exécuter la commande dans zsh. Zsh a quelques options d'extension de nom de fichier funky par rapport à bash, par ex.

sed -i '/pattern/d' **/*.(c|h) 

se déroulera sed sur tous les fichiers de la baisse du répertoire courant qui a une extension .c ou .h.

1

Avec Powershell positionné dans le répertoire racine:

foreach($file in (dir -r -i *.txt -force)) { $cleaned = gc $file | where { $_ -notlike "*Hello*" }; sc $file $cleaned } 

Changez le filtre * txt et les critères de correspondance « Bonjour » à tout ce que vous voulez.

2

En supposant, les fichiers ont une extension de .foo, les éléments suivants doivent faire:

for /f %f in ('dir /s /b *.foo') do findstr /v hello %f > c:\temp\x && move /y c:\temp\x %f 

HTH - René

Questions connexes