Используя команду sed, найдите слово и подставьте следующее слово - PullRequest
0 голосов
/ 03 марта 2020

У меня есть большой файл со словом TITLE и ближайшим словом name. Так, например:

cat file1 :

NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('QA')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('QA')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('RN') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')

Я пытаюсь заменить все TITLE (...) на TITLE ('DEV'). Таким образом, вывод должен быть:

cat file1 :

NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('DEV')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('DEV')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('DEV') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')

Я просто использовал sed для grep заголовка и все после:

sed 's/.*\(TITLE...\)/\1/' file1 

Не уверен, как заменить часть TITLE. Любая помощь приветствуется, спасибо.

Ответы [ 4 ]

2 голосов
/ 03 марта 2020
sed --expression="s/TITLE('[^']*')/TITLE('DEV')/" file1

Дайте мне знать, если вам нужно объяснение вышеуказанного RegExp.

2 голосов
/ 03 марта 2020

Если ваш пример входного файла представляет все ваши возможные входные данные, то следующее, возможно, самое короткое и все еще читаемое решение, которое вы можете получить

sed "s/TITLE([^)]*)/TITLE('DEV')/" file1
2 голосов
/ 03 марта 2020

Для данного формата это будет сделано:

sed -e "s#\(TITLE('\)[^']\+')#\1DEV')#" file1

На самом деле это может быть немного проще для разбора:

sed -e "s#\<TITLE('[^']\+')\>#TITLE('DEV')#" file1

И мы не особо экономим столько, набирая с обратная ссылка.

Вы найдете любой экземпляр TITLE('<CHARS_NOT_APOSTROPHE>') (для хорошей меры я также добавил края слова) и замените его на TITLE('DEV').

0 голосов
/ 03 марта 2020

Пример данных:

$ cat titles.dat
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('QA')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('QA')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('RN') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')

Один sed решение:

$ sed "s/\(TITLE('\)[^']*\(')\)/\1DEV\2/g" titles.dat
NAME('SAM') SURNAME('WILLIAMS') PASWD('SAMWIL') TITLE('DEV')
NAME('JOHN') SURNAME('ROGERS') PASWD('ROGJH') TITLE('DEV')
NAME('MATT') SURNAME('JERRY') GRP('ONE') TITLE('DEV') PASWD('JERMAT')
NAME('TEST2') SURNAME('NAZ') GRP('TWO') AUTH(USE) TITLE('DEV') GRP('ONE')

Где:

  • \(TITLE('\) - найдите наш первый образец TITLE('; сохранить как шаблон # 1
  • [^']* - сопоставить все после шаблона # 1, если только ни одной кавычки (')
  • \(')\) - найти наш второй шаблон '); сохранить как шаблон № 2
  • \1DDEV\2 - выходной шаблон № 1 + 'DEV' + шаблон № 2
...