2013-10-10 3 views
0

У меня есть следующий сценарий:Awk - subsititute текст в определенном месте

script.sh:

#!/bin/bash 

FileName=$1; 
awk ' 
/Import()/ 
{ 
    while (sub(/\$requestedMessage/, "bar") == 0) 
    { 
     print; 
     getline; 
    } 
} 
1' > file.tmp $FileName 

И следующий файл:

файл:

function FunctionA() 
{ 
    message=$requestedMessage 
} 

function FunctionB() 
{ 
    message=$requestedMessage 
} 

Идея состоит в том, чтобы позвонить

./script.sh file 

и заменить message=$requestedMessage переменные в функции FunctionB() для message=bar, но только в FunctionB() и не FunctionA()

Я очень новый для AWK и я, кажется, не понимаю, что я делаю неправильно.

Спасибо,

ответ

1
awk -v RS= -v ORS='\n\n' ' 
/FunctionB\(\)/ { 
    sub(/\$requestedMessage/, "bar") 
} 
1' "$FileName" > file 

Может быть, это больше похоже на то, что вы имели в виду:

awk ' 
/^function/ { inTarget = (/FunctionB\(\)/ ? 1 : 0) } 
inTarget { sub(/\$requestedMessage/, "bar") } 
1' "$FileName" > file 

Если нет - как вы знаете, когда вы дойдете до конца определения функции? Вышеприведенное предполагает, что вы знаете, что одна функция закончилась, когда начинается следующее определение функции.

+1

Привет, Это работает! Но когда я швыряю, чтобы добавить концы до «{» и после «}», чтобы попытаться понять ваш код, он перестает работать ... Можете ли вы объяснить в своем ответе, как это работает немного? – Kam

+0

Также мы можем сделать это без использования RS и ORS, так как это сделает зависимый файл «файл» – Kam

+0

Вы не можете поместить символ новой строки перед '' ', поскольку это полностью изменяет значение скрипта. Пробелы имеют значение в awk-скриптах. Я поставил пару новых строк, где они могут идти. Вы можете написать другой скрипт, чтобы делать то, что вы хотите, не устанавливая RS и ORS, но я не понимаю, что вы имеете в виду, когда говорите, что их установка «сделает файл решения« зависимым »- какой файл и почему? –

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