2010-07-18 10 views
3

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

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 

Может люди, пожалуйста, помогите с тем, как это сделать с СЕПГ. Я попробовал несколько инструкций, но не работал. Спасибо,

Jagrati

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

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

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

ответ

5

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

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

Это не из-за неравномерного числа пробелов. – Anders

+0

Правда, когда я попробовал это, это было возможно заменить в первой строке, но не в более поздних. – xyz

+0

sed 's/^ * \ ([^] * \) \ \ + \ ([^] * \) \ + есть/\ 1 \ 2 был /' file> result – Anders

6

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

$ 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 неплохо, только что начал читать язык программирования awk. – Anders

+0

Что означает 1 между '}' и '' '? – odessos

1

Это смотрит на границах слов, а не только пробелы, так что работает, когда есть знаки препинания тоже. Она требует 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

В любом типе СЭД:

sed 's/^\([[:blank:]]*[^[:blank:]]\{1,\}[[:blank:]]\{1,\}[^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)[^[:blank:]]\{1,\}\(.*\)$/\1was\2/' words 
Смежные вопросы