2017-01-24 6 views
1

Я хочу знать, как использовать две утилиты «grep» и «sed» или что-то еще, чтобы заменить подстроку. Я объясню, что я хочу сделать ниже.Как использовать grep и sed для замены подстроки после поиска определенной строки?

У нас есть файл 'test.txt' со следующей строкой:

A1 = 'АА1', А2 = 'АА2', A3 = 'AA3', A4 = 'AA4', A5 { атр} = 'AA5', A6 = 'keyword_A'

После поиска с помощью Grep 'keyword_A', я хочу, чтобы заменить значение A5 с другой строкой, например, "NEW".

А1 = 'АА1', А2 = 'АА2', А3 = 'АА3', А4 = 'АА4', А5 {ATTR} = 'NEW', A6 = 'keyword_A'

Я попытался использовать две команды, такие как

grep keyword_A test.txt | sed -e 's/blabla/blabla/' 

После попытки всего, что я знаю, я вообще отказался.

Пожалуйста, дайте мне знать правильное решение.

+0

см. Также [примеры sed doc для таких проблем] (https://stackoverflow.com/documentation/sed/3120/address-and-address-range#t=201701240411428268083) – Sundeep

ответ

2

Во-первых, вам никогда не нужны grep и sed. У Sed есть полная поисковая система с регулярным выражением, поэтому это надмножество grep. Эта команда будет читать test.txt, изменять строки, которые вы указали, и распечатать весь результат на стандартный вывод:

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/g" < test.txt 

Если вы хотите сохранить результаты в файл test.txt, используйте -i (Дей Место для редактирования) переход к sed:

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/g" -i.bak test.txt 

Если вы хотите выбрать только указанные строки, изменять те, и печатать только те строки, в стандартный вывод, используйте комбинацию (команда p печати) и -n (нет выход) переключатель.

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/gp" -n test.txt 
0

Использование grep + sed - это всегда неправильный подход. Вот один из способов сделать это с GNU AWK:

$ awk '/keyword_A/{ $0=gensub(/(A5({[^}]+})?=\047)[^\047]+/,"\\1NEW",1) } 1' file 
A1='AA1', A2='AA2', A3='AA3', A4='AA4', A5{ATTR}='NEW', A6='keyword_A' 
0

Используя пару переменных, которые вы могли бы определить ключевое слово и замену (если они изменяются вообще):

q="keyword_A" 
r="NEW" 

Затем с sed:

sed -r "s/^(.+\{.+\}=')(.+)('.+"${q}".+)$/\1"${r}"\3/" file 

Результат:

A1='AA1', A2='AA2', A3='AA3', A4='AA4', A5{ATTR}='NEW', A6='keyword_A' 
0
A5="NEW" 
A6="keyword_A" 

# with sed 
sed "s/='[^']*\(',[[:blank:]]*A6='${A6}'\)/='${A5}\1/" YourFile 

# with awk 
awk -F "'" -v A5="${A5}" -v A6="${A6}" ' 
    BEGIN { OFS="\047" } 
    $12 == A6 { $10 = A5; $0 = $0 } 
    7 
    ' YourFile 
  • Изменение в конце строки, для СЭД и использования ' в качестве разделителя полей в AWK вместо традиционного пространства.
  • при условии, что нет стоимости не ' (или нужно лечить метод побега) для AWK версии
0

Мы можем только непосредственно заменить пятую колонну, когда жало keyword_A найден, как показано ниже:

awk -F, 'BEGIN{OFS=",";}/keyword_A/{$5="A5{ATTR}='"'"NEW"'"'"}1' filename 
0

Пара небольших альтернатив:

sed -r "/keyword_A/s/(A5[^']*')[^']*/\1NEW/" 

awk -F"'" '/keyword_A/{$10 = "NEW"}1' OFS="'" 

конечно Отрицательная с AWK это впоследствии вам придется переименовать новый файл.