J'ai un fichier comme
abc dogdogdogdog 1.0 abc cat 2.4 abc elephant 1.2
et je veux remplacer le dernier mot d'une ligne qui contient «éléphant» par une chaîne que je connais. Le résultat devrait être
abc dog 1.0 abc cat 2.4 abc elephant mystring
J'ai sed '/.*elephant.*/s/%/%/' $ file
mais que devrait être au lieu de '%'?
MODIFIER: exemple étrange
abc dog 1.0 abc cat 2.4 abc elephant 1.2
et essayez maintenant de changer la dernière ligne.
4 Réponses :
EDIT: Pour conserver les espaces, veuillez essayer de suivre.
awk '/elephant/{$NF="my_string"} 1' Input_file > temp_file && mv temp_file Input_file
Pourriez-vous s'il vous plaît essayer de suivre (si vous êtes d'accord avec awk
).
awk '/elephant/{$NF="my_string"} 1' Input_file
Si vous souhaitez enregistrer la sortie dans Input_file lui-même, essayez de suivre.
awk ' match($0,/elephant[^0-9]*/){ val=substr($0,RSTART,RLENGTH-1) sub("elephant","",val) $NF=val "my_string" val="" } 1 ' Input_file
c'est bien, mais si j'ai plusieurs espaces, awk le supprime. comment empêcher awk de faire cela?
@czaduu, au cas où vous êtes d'accord avec TAB dans les espaces, vous pouvez essayer ma 2ème solution.
@czaduu, avec votre exemple donné, cela me convient, pouvez-vous s'il vous plaît poster un échantillon dans votre message et me le faire savoir alors? (avec un espace impair)
vous pouvez trouver un exemple à la fin de ma question
@czaduu, pouvez-vous essayer ma solution EDIT maintenant et me le faire savoir? /
c'est zonte! Merci! encore une question - j'ai ajouté edit2.
@czaduu, c'est tous ensemble une question différente, il n'est PAS recommandé de continuer à changer votre question, veuillez ouvrir une nouvelle question pour elle. Supprimez cela de cette question également, merci.
@czaduu, veuillez consulter cette URL stackoverflow.com/help/someone-answers que faire lorsque quelqu'un répond sur SO.
une alternative pour faire la substitution et préserver l'espace:
kent$ cat f abc dog 1.0 abc cat 2.4 abc elephant 1.2 kent$ awk '/elephant/{sub(".{"length($NF)"}$","new")}7' f abc dog 1.0 abc cat 2.4 abc elephant new
avec votre exemple:
awk '/elephant/{sub(".{"length($NF)"}$","new")}7' file
Robustement dans n'importe quel awk:
$ awk '$2=="elephant"{sub(/[^[:space:]]+$/,""); $0=$0 "mystring"} 1' file abc dog 1.0 abc cat 2.4 abc elephant mystring
Notez que contrairement aux autres réponses que vous avez jusqu'à présent, il n'échouera pas lorsque la chaîne cible ( elephant
) fait partie de une autre chaîne ou apparaît à un autre emplacement que le 2ème champ ou contient des métacarques d'expression régulière, ou lorsque la chaîne de remplacement contient &
, etc.
basic
sed '/elephant/ s/[^[:blank:]]\{1,\}[[:blank:]*$/mystring/' $file
si de l'espace pourrait être à la fin
sed '/elephant/ s/[^[:blank:]]\{1,\}$/mstring/' $file
sed 's / \ (elephant \) \ (. * $ \) / \ 1 mystring /' entrée
Bienvenue à SO, comme mentionné dans les commentaires également, les exigences en constante évolution ne devraient PAS se produire pour aucune question. Ajoutez également toujours 3 choses dans votre message, 1 échantillon d'entrée, 2 échantillon de sortie attendue et 3 efforts que vous avez mis pour résoudre votre problème dans CODE TAGS dans votre message, bon apprentissage.