Dans un fichier avec beaucoup de lignes, je veux supprimer les lignes commençant par HERE IT IS
.
Comment puis-je faire cela en utilisant uniquement des outils de ligne de commande?
Dans un fichier avec beaucoup de lignes, je veux supprimer les lignes commençant par HERE IT IS
.
Comment puis-je faire cela en utilisant uniquement des outils de ligne de commande?
Réponses:
Essayez sed
:
sed -i '/^HERE IT IS/d' <file>
AVERTISSEMENT: il est préférable d'effectuer une sauvegarde lors de l'utilisation d'un -i
commutateur de sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Le fichier d'origine restera tel que <file>.bak
et le fichier modifié sera <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.
En plus de la très bonne grep
et les sed
réponses que vous avez reçu, voici quelques autres outils qui peuvent faire la même chose:
Quelques façons Perl:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
Vous pouvez ajouter le -i
commutateur à l'un des exemples pour modifier le fichier en place:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(rester bouche bée
awk '!/^HERE IT IS/' file > newfile
Les versions plus récentes (4.1.1 et ultérieures) de GNU awk
(par défaut awk
sous Linux) peuvent également modifier le fichier en place:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash
, zsh
, ksh
, probablement d' autres). C'est assez idiot cependant, cela peut être fait mais d'autres outils sont meilleurs.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
celui m'a fait LOL)
printf "%s\n" "$line"
: en citant $ line pour préserver les espaces blancs et en évitant certains problèmes d'écho (interprétation de caractères spéciaux, etc.). et évite la nécessité d'ajouter --
aussi.
IFS=
et -r
, je peux aussi bien aller jusqu'au bout et le rendre robuste.
sed
est définitivement la voie à suivre.
Cette légère modification de la commande que @heemayl vous a donnée supprimera la ligne, que le même cas soit utilisé dans le modèle ou non, en raison du I dans la référence du modèle.
sed -i '/HERE IT IS/Id' <file>
Si vous aviez plusieurs fichiers dans un répertoire sur lequel vous vouliez le faire, vous pouvez le combiner avec find like so.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
L'option maxdepth signifie que cela ne se reproduira pas dans les répertoires.
Une autre option python:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Où f est le chemin d'accès au fichier, entre guillemets.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
assertion d'anticipation négative qui fait que le moteur d'expression régulière ne correspond à toutes les limites de début de ligne ( qui sont généralement mises en correspondance par^
) que s'il n'est pas suivi par la chaîneHERE IT IS
python
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Enregistrez le script dans un fichier, dites script.py
, puis exécutez-le via la commande ci-dessous sur le terminal.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, mais ce n'est pas beaucoup plus efficace que startswith
. Je me demandais comment [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
ne produirait pas la sortie dans une liste.
Vous pouvez utiliser Vim en mode Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
recherche globale
d
supprimer
x
sauver et fermer
vim
comme cecivim '+g/^HERE IT IS/d' +wq test.txt