Je veux que SED remplace le motif correspondant dans l'ensemble du fichier avec une valeur incrémentielle. Pour par exemple, le modèle de correspondance est Den et je veux que toutes les instances de DEN dans le fichier soient remplacées par une nouvelle ligne et des numéros incrémentiels. Ce que j'ai essayé et échoué est:
a=1 while read in; do a=$((a+1)) && sed ""$in"s/den/ten\n"$a"/"; done <<< "$(grep 'den' -o -n file | cut -f1 -d ':')"
3 Réponses :
code suivant: sorties: p>
Utiliser grep code> pour produire des numéros de ligne pour
SED code> est décidément un anticipation -
SED code> peut certainement trouver les correspondances de regex à sien. Mais ce problème semble plus approprié pour AWK.
awk '{ while(/den/ && sub("den", "ten\n" ++a));; print }' file
Notez que la variable sera incrémentée même si une ligne ne correspond pas à den code> ...
perl -pe 's / den / "TEN \ N". ++ $ c / ge ' code> corrigerait ça
ou awk '{alors que (/ den / && sub ("den", "dix \ n" ++ a)) ;; imprimer} ' code>
N'y a-t-il pas une solution à base de SED pure sans awk
Pourquoi pensez-vous qu'il devrait y avoir? sed code> n'a pas de variables intégrées ni de support en mathématiques; Vous devrez dépendre de l'utilité externe de toute façon.
Une solution code> SED sans awk code> pourrait être quelque chose comme
pour ((i = 1; fichier grep -q dix; i ++)) do Sed_replacing_one_octiver_with_ $ i; fait code> mais ce serait une solution terrible.
Utilisez "DEN" comme séparateur d'enregistrement et augmentation d'enregistrement comme incrément:
awk 'BEGIN {RS="den"; ORS=""} NR>1 {printf "ten\n" NR-1} 1' file
Je ne comprends pas, pourriez-vous reformater votre message pour poster de manière proprement la sortie attendue et l'entrée i> dans des blocs de code avec
\ n code> remplacé par une nouvelle ligne réelle? Quelle est l'entrée? Que devrait être la sortie? Comment «la sortie attendue» générée? Quelle est l'entrée?