Как заменить 3-е слово в строке, используя sed - PullRequest
3 голосов
/ 18 июля 2010

Это мой 3-й пост в процессе изучения сед. У меня есть гипотетическое требование. Я хочу иметь возможность заменить 3-е слово в каждой строке на «был», где слова разделены пробелом.

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

Желаемый вывод:

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

Не могли бы люди помочь с тем, как это сделать с помощью sed. Я попытался выполнить несколько инструкций, но ничего не вышло. Спасибо,

Jagrati

Я нашел это! Я нашел это!

Хорошо, я наконец получил правильные инструкции. Это работает:

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

Ответы [ 4 ]

7 голосов
/ 18 июля 2010

если вас не волнует форматирование, это более простой подход

$ 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
5 голосов
/ 18 июля 2010

Я всегда делаю это так: сопоставьте первое и второе слова, используя группы , а затем замените их на себя, используя обратную ссылку .

sed 's/^\([^ ]*\) \([^ ]*\) is/\1 \2 was/'
1 голос
/ 18 июля 2010

Это смотрит на границы слов, а не только на пробелы, поэтому оно работает, когда есть пунктуация.Требуется 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 голосов
/ 13 ноября 2012

В любом типе седа:

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