Comment remplacer la troisième occurrence de la chaîne dans le fichier à l'aide de la sed
commande.
Exemple:
Changer la troisième occurrence de is
à us
dans le fichier.
Mon fichier d'entrée contient:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Je m'attends à ce que la sortie soit:
hai this is linux.
hai thus is unix.
hai this is mac.
hai this is unchanged.
text-processing
sed
perl
Suresh Kumar
la source
la source
sed
n'est pas le bon outil pour le travail.Réponses:
C'est beaucoup plus facile à faire
perl
.Pour modifier la 3 ème occurrence:
Pour changer toutes les 3 ème occurrence:
la source
Lorsque la chaîne de remplacement ne se produit qu'une seule fois par ligne, vous pouvez combiner différents utilitaires.
Lorsque l'entrée est dans le fichier "entrée" et que vous remplacez "est" par "nous", vous pouvez utiliser
la source
is
par ligne.Le script ci-dessous (utilisant la syntaxe GNU
sed
) est utilisable pour l'édition sur place et non pour la sortie car il arrête les lignes d'impression après la substitution souhaitée:Si votre décision comme le choroba vous pouvez modifier ci-dessus pour
qui sort toutes les lignes
Ou vous devez mettre toutes les lignes dans l'espace de motif (en mémoire, alors faites attention à la limitation de taille) et faites la substitution
la source
Vous pouvez l'utiliser
sed
pour cela si auparavant des sauts de ligne sont remplacés par d'autres caractères, par exemple:Et la même chose avec pure (GNU)
sed
:(
sed
remplacement newline sans vergogne volé sur /programming//a/1252191/4488514 )la source
sed
une syntaxe spécifique à GNU , vous pourriez aussi bien l'utilisersed -z 's/is/us/3'
.-z
doit être une toute nouvelle fonctionnalité, monGNU sed version 4.2.1
ne sait rien de cette option.\x0
étape.Ce morceau de
sed
transporte juste un décompte desis
occurrences d'une ligne à la suivante. Il devrait gérer de manière fiable autant d'is
es par ligne que vous y jetez, et il n'a pas besoin de mettre en mémoire tampon les anciennes lignes pendant qu'il le fait - il conserve juste un seul caractère de nouvelle ligne pour toutis
ce qu'il rencontre qui ne fait pas partie d'un autre mot.Le résultat est qu'il ne modifiera que la troisième occurrence dans un fichier - et il portera des comptes par ligne. Donc, si un fichier ressemble à:
... il imprimera ...
Il gère d'abord les cas de bord en insérant un espace à la tête et à la queue de chaque ligne. Cela rend les limites des mots un peu plus faciles à déterminer.
Il recherche ensuite les
is
es valides en insérant une ligne\n
électronique avant que toutes les occurrences deis
celle-ci ne précèdent immédiatement zéro ou un caractère de ponctuation suivi d'un espace. Il fait un autre passage et supprime tous les\n
ewlines qui sont immédiatement précédés d'un caractère non-espace. Ces marqueurs laissés correspondrontis.
etis
mais pasthis
ou?is
.Il rassemble ensuite chaque marqueur à la queue de la chaîne - pour chaque
\ni
correspondance sur une ligne, il ajoute une ligne\n
électronique à la queue de la chaîne et la remplace par soit pari
ouu
. S'il y a 3\n
lignes électroniques consécutives rassemblées à la fin de la chaîne, alors il utilise le u - sinon le i. La première fois que au est utilisé est également le dernier - le remplacement déclenche une boucle infinie qui se résume àget line, print line, get line, print line,
et ainsi de suite.À la fin de chaque cycle de boucle d'essai, il nettoie les espaces insérés, imprime uniquement jusqu'à la première nouvelle ligne apparaissant dans l'espace de motif et recommence.
Je vais ajouter une
l
commande ook en tête de boucle comme:... et jetez un œil à ce qu'il fait car il fonctionne avec cette entrée:
... alors voici ce que ça fait:
Cela a plus de sens peut-être avec plus d'
is
es par ligne:C'est pratiquement la même chose, mais écrit avec POSIX BRE et une gestion rudimentaire des arguments.
... obtient ...
... et si j'active
${dbg}
:... nous pouvons le regarder itérer ...
la source
Voici une solution logique qui utilise
sed
ettr
doit être écrite dans un script pour que cela fonctionne. Le code ci-dessous remplace chaque 3ème occurrence du mot spécifié dans lased
commande. Remplacezi=3
pari=n
pour que cela fonctionne pour toutn
.Code:
Pourquoi cela fonctionne:
Supposons que le fichier texte soit
a b b b b a c a d a b b b a b e b z b s b a b
.Lorsque n = 2: nous voulons remplacer chaque seconde occurrence de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . ^ . ^ . . . . . . ^ . . ^ . . . ^ . ^ . ^
Lorsque n = 3: nous voulons remplacer chaque troisième occurrence de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . . ^ . . . . . . . ^ . . . . ^ . . . . . ^
Lorsque n = 4: nous voulons remplacer chaque troisième occurrence de
b
.la source