2013-09-25 2 views
1

У меня есть этот файл:Путаница с * в Sed

test.txt 
============ 
a b c 
testing=123 
a b c 

Я думал, следующая команда заменит тестирование = 123 строки.

sed "s/^testing=*/testing=alpha/g" test.txt 

Он в результате в:

a b c 
testing=alpha123 
a b c 

Так что мне нужно:

sed "s/^testing=[^\n]*/testing=alpha/g" test.txt 

, чтобы получить это:

a b c 
testing=alpha 
a b c 

Может кто-нибудь объяснить, что происходит. Символ * должен соответствовать всем символам.

ответ

3

* означает любое количество повторений предыдущей конструкции (включая 0 повторений). . означает любой символ. Таким образом, у вас должно быть .* для соответствия всем символам, а не * (что от глобуса).

Таким образом, это решение:

$ sed "s/^testing=.*/testing=alpha/g" test.txt 
a b c 
testing=alpha 
a b c 
+2

Вы были быстро! Я удаляю свой ответ, поскольку ваш был первым, и объясняет это лучше :) +1 – fedorqui

+1

Теперь я знаю, как работает [^ \ n] *. Он соответствовал любым символам, отличным от нового символа строки. – Exploring

+2

Просто указывая на полноту, «любое количество повторений» включает в себя нулевые повторения. '*' соответствует нулю или более вхождений предыдущей конструкции. – ajk

-1

Это не объясняет sed, но показывает, как это может быть сделано с awk

awk -F= '/^testing/ {$2="alpha"}1' OFS== test.txt 
Смежные вопросы