2
votes

remplacer le dernier mot dans la ligne spécifique sed

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.


2 commentaires

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.


4 Réponses :


1
votes

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


8 commentaires

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.



0
votes

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


0 commentaires

0
votes

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.


0 commentaires

1
votes

basic

sed '/elephant/ s/[^[:blank:]]\{1,\}[[:blank:]*$/mystring/' $file

si de l'espace pourrait être à la fin

sed '/elephant/ s/[^[:blank:]]\{1,\}$/mstring/' $file


0 commentaires