2010-07-18 6 views
3

Ceci est mon troisième poste dans le processus d'apprentissage sed. J'ai une exigence hypothétique. Je veux être en mesure de remplacer le troisième mot de chaque ligne par 'était', où les mots sont délimités par un espace (s).Comment remplacer 3e mot dans une ligne en utilisant sed

bash$ cat words 
hi this is me here 
hi this is me again 
hi this is me yet again 
hi this is  me 

sortie souhaitée:

hi this was me here 
hi this was me again 
hi this was me yet again 
hi this was  me 

personnes pourraient aider s'il vous plaît comment le faire avec sed. J'ai essayé quelques instructions d'exécution, mais cela n'a pas fonctionné. Merci,

Jagrati

je l'ai trouvé! Je l'ai trouvé!

Bon, j'ai enfin la bonne instruction. Cela fonctionne:

sed -e 's/[^ ]*[^ ]/was/3' words 

Répondre

5

Je fais toujours comme ça: correspondre à la première et la deuxième mot en utilisant groupes, puis les remplacer par eux-mêmes en utilisant un backreference.

sed 's/^\([^ ]*\) \([^ ]*\) is/\1 \2 was/' 
+0

Cela échouera en raison du nombre impair d'espaces. – Anders

+0

Vrai, quand je l'ai essayé, c'était capable de remplacer dans la première ligne, mais pas dans les derniers. – xyz

+0

sed 's/^ * \ ([^] * \) \ \ + \ ([^] * \) \ + est/\ 1 \ 2 était /' fichier> résultat – Anders

6

si vous ne se soucient pas de la mise en forme, c'est une approche plus simple

$ awk '{$3="was"}1' file 
hi this was me here 
hi this was me again 
hi this was me yet again 
hi this was me 
+0

+1, awk est sympa, viens de commencer à lire le langage de programmation awk. – Anders

+0

Que signifie 1 entre '}' et '' '? – odessos

1

Cela ressemble à des limites de mots plutôt que que des espaces de sorte qu'il fonctionne quand il y a des signes de ponctuation, aussi. Elle exige GNU sed:

$ cat words 
hi this is me here 
hi this is me again 
hi this is me yet again 
hi this is  me 
hi this "is, me 
$ sed 's/\w\+\(\W\)/was\1/3' words 
hi this was me here 
hi this was me again 
hi this was me yet again 
hi this was  me 
hi this "was, me 
0

En tout type de sed:

sed 's/^\([[:blank:]]*[^[:blank:]]\{1,\}[[:blank:]]\{1,\}[^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)[^[:blank:]]\{1,\}\(.*\)$/\1was\2/' words 
Questions connexes