2015-01-15 2 views
0

У меня есть файл с именем names.xmlSED удалить матч в кавычках в строке, содержащий несколько цитат

Это выглядит как ниже:

NAME="Stacey" SURNAME="Ford" 
    blah blah blah 
    NAME="Stacey" SURNAME="Ford" 
    blah blah blah 

Мне нужно найти все вхождения NAME =»и с в «» кавычки мне нужно заменить имя с другим значением

Так что выход должен выглядеть следующим образом:.

NAME="Jack" SURNAME="Ford" 
    blah blah blah 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 

Я использую: sed 's/NAME=".*"/NAME="Jack"/g' names.xml

Но это результат дает мне:

NAME="Jack" 
    blah blah blah 
    NAME="Jack" 
    blah blah blah 

Он смотрит на все, вплоть до последнего "на ФАМИЛИЯ.

Ваше время и помощь с благодарностью.

ответ

5

Вам необходимо использовать класс символов с отрицанием [^"]*, который соответствует любому символу, но не " ноль или более раз. .* в вашем регулярном выражении жадно по умолчанию, он ест все символы до последних " двойных кавычек. Так что только он соответствует Stacey и до последних Ford. А также вам необходимо добавить границу слова \b до NAME, так что она не будет соответствовать строке NAME в SURNAME. \b совпадает между символом слова и символом, отличным от слова.

sed 's/\bNAME="[^"]*"/NAME="Jack"/g' names.xml 
+0

Это не работает, оно также соответствует фамилии, вы должны удалить 'g'. –

+0

Извините, добавлено слово границы .. Попробуйте сейчас .. –

+1

Yep работает сейчас. Nice –

2

Вот awk версия:

awk -F\" -vOFS=\" '$1~/NAME=/ {$2="Jack"}1' file 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 

Использование " в качестве разделителя полей. Если поле 1 содержит NAME= замените подано 2 на номер Jack и распечатайте его.

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