2013-10-11 2 views
0

Я использую GNU Sed 4.2.1. Я пытаюсь заменить второе поле в следующей строке (пароль в /etc/shadow). Awk - это не вариант.Как я могу получить sed только для первого появления символа?

username:[email protected][email protected]$H:15986:0:365:::: 

Я попытался

sed -i 's/\(^[a-z]*\):.*?:/\1:TEST:/' 

, но ничего. Я пробовал много вариантов, но по какой-то причине я не могу заставить его соответствовать только этому полю. Помогите?

ответ

2

Используйте [^:]*, чтобы соответствовать все вплоть до следующего :

sed -i 's/^\([^:]*\):\([^:]*\):/\1:TEST:/' 
+0

Отлично! Я забыл [^] как вариант. Спасибо! – user2871860

1

Использование СЭД:

sed -i.bak 's/^\([^:]*:\)[^:]*\(.*\)$/\1foo\2/' file 

Использование AWK вы можете сделать:

awk -F: '{$2="foo"}1' OFS=: file 
+0

awk не вариант говорит OP, не уверен, почему – iruvar

+0

@ 1_CR: Ok sed решение также предусмотрено. – anubhava

+0

Awk не является вариантом, потому что редактирование должно быть на месте. Разрешения и прочее. – user2871860

Смежные вопросы