Existe-t-il une commande qui me permettra d'éditer les n dernières lignes d'un fichier? J'ai plusieurs fichiers, qui ont tous un nombre différent de lignes à l'intérieur. Mais je voudrais modifier les n dernières lignes de chaque fichier. L'objectif est de remplacer les virgules par des points-virgules dans les n dernières lignes. Mais seulement dans les toutes dernières n lignes.
Je ne veux supprimer aucune ligne, je veux juste remplacer chaque virgule par un point-virgule dans les n dernières lignes de chaque fichier.
En utilisant la commande sed, je peux remplacer la toute dernière ligne par cette commande. Comme décrit ici: Comment supprimer du texte sur la dernière ligne d'un fichier?
Mais cela ne me permet que de modifier la toute dernière ligne, et non le n dernier nombre de lignes.
la source
sed '24,$s/,/:/g' filename
où24
est la ligne de départ »Réponses:
Pour remplacer les virgules par des points-virgules sur les n dernières lignes par
ed
:Séparer cela:
ed -s
= exécuté en mode silencieux (ne signalez pas les octets écrits à la fin)'$-'
= à partir de la fin du fichier ($
) moins ...$((n-1))
= n-1 lignes ...$' ... '
= cite le reste de la commande pour le protéger du shell),$s/,/;/g
= ... jusqu'à la fin du fichier (,$
), recherchez et remplacez toutes les virgules par des points-virgules.\nwq
= terminer la commande précédente, puis enregistrer et quitterPour remplacer les virgules par des points-virgules sur les n dernières lignes par
sed
:Briser cela:
-i
= éditer le fichier "sur place"$(( ... ))
= faire un peu de calcul:$( wc -l < input)
= récupère le nombre de lignes dans le fichier-n + 1
= reculer de n-1 lignes,\$
= de n-1 lignes jusqu'à la fin du fichier:s/,/;/g
= remplacer les virgules par des points-virgules.la source
wc -l < input
parwc -l input
. Devrait être plus rapide de quelques nanosecondes :)wc -l input
affiche également le nom du fichier; nous ne voulons que le nombre de lignesSolution utilisant tac et sed pour remplacer chaque virgule par un point-virgule dans les 50 dernières lignes de file.txt:
la source
Avec GNU
head
et un shell de type Bourne:Nous remplaçons le fichier sur lui-même. C'est OK ici pour une translittération d'octet à octet mais pas nécessairement si la modification implique de changer la taille du fichier (dans ce cas, vous voudriez le remplacer
1<> file
par> other-file && mv other-file file
exemple).la source
1<>
lesquels je n'étais pas familier. De plus,sponge
de moreutils est un bon outil pour les pipelines où vous souhaitez remplacer votre entrée.Supposons que nous voulons remplacer les dernières
7
lignes de la séquence suivante par un script shell et une implémentation GNU desed
:Étape 1 : permet d'obtenir le dernier numéro de séquence de la ligne comme suit. Jetez un œil à ceci et à cela :
Étape 2 : permet de définir le nombre de lignes (en fin de séquence) que nous souhaitons éditer:
Étape 3 : permet de calculer la ligne de départ en fonction des variables précédentes, comme suit. Jetez un œil à ceci :
Étape 4 : Maintenant, nous pouvons remplacer les 7 dernières lignes de séquence par quelque chose d'autre, comme le suivant. Jetez un œil à ceci :
L'étape 4 utilise la section 4.4 de la page de manuel sed qui dit:
L'étape 4 utilise également des guillemets doubles comme mentionné ici .
Eh bien, les 4 étapes ne sont pas nécessaires si nous utilisons la réponse de Gohu comme ceci:
la source
Utilisation
tail
et pipe à sed:tail -n 20 file | sed 's/,/;/g'
Cela fonctionne sur le fichier des 20 dernières lignes. Si vous voulez avoir directement des canges pour l'utilisation du fichier:
tail -n 20 file | sed -i 's/,/;/g'
la source