J'ai un script Bash qui écrit les données dans un fichier journal, puis je retire les données que je souhaite à l'aide de la commande sed
. Cela me donne un fichier data.txt
. Ce que je veux savoir, c'est comment je vais supprimer une ligne spécifique à l'intérieur de ce fichier data.txt
.
Par exemple:
123
456
789
Je veux supprimer la 2ème ligne, contenant 456
afin que je n'ai que
123
789
J'ai essayé avec sed '2d' data.txt
mais cela ne fonctionne pas.
J'utilise cette commande pour créer data.txt
à partir de log.log
:
sed -nE '1s/.{1}(.{2}).*/\1/p;' log.log >> data.txt
Essaye ça. Cela devrait marcher.
sed -i '2d' data.txt
Vous devez ajouter -i
flag avec la commande sed à moins que vous ne redirigiez votre sortie vers un nouveau fichier. Si vous n'ajoutez pas l'indicateur -i
, sed imprimera l'espace de modèle sur STDOUT et n'apportera aucune modification au fichier d'origine.
option de sauvegarde automatique
Il est très dangereux de modifier un fichier sans effectuer une sauvegarde appropriée. Ainsi, sed a sa méthode native pour sauvegarder un fichier avant édition qui est l'option -i.bak
.
Ainsi, dans l'exemple ci-dessus, si nous utilisons l'option de sauvegarde, la commande serait.
sed -i.bak '2d' data.txt
Ainsi, il supprimera la première ligne du fichier data.txt et fera également une copie de sauvegarde du fichier d'origine avec l'extension .bak
.
Vous savez, en plus de spécifier par numéro de ligne, vous pouvez également le faire en faisant correspondre le contenu de la ligne, si cela est plus utile (ce qui semble être le cas):
sed -i '/^456$/d' data.txt
Utilisation de awk
:
awk 'NR!=2{ print }' input-file > output-file
Cela pourrait se lire comme suit: si le nombre d’enregistrements n’est pas égal à 2, imprimez l’enregistrement (ligne). Si vous souhaitez supprimer la deuxième et la troisième ligne:
awk 'NR!=2 && NR!=3 { print }' input-file
Si vous voulez avoir une ligne vide telle qu'elle apparaît dans la question, la commande sed
devrait ressembler à ceci:
sed '2 s/^.*$//' input-file
Le premier caractère 2
est le numéro de la ligne, suivi de la commande s
, qui remplacera tous les caractères .*
du début ^
à la fin $
de la ligne par une chaîne vide //
. Dans ce cas, les caractères de début et de fin peuvent être omis.
Exemple:
$ cat input-file
123
456
789
654
$ sed '2,3 s/.*//' input-file
123
654
Cette commande supprimera les lignes 2 à 4 et 6
sed -e '2,4d;6d' file