Как заменить слово в n-й строке после нескольких совпадений с образцами в разных строках? - PullRequest
3 голосов
/ 17 октября 2019

Я пытаюсь выяснить, есть ли способ использовать SED или AWK для замены слова при определенных вложенных условиях. Пример кода:

void className::functName1_testName1_paramA()
{
     some_code;
    /* comment */
    returnType_1 paramA  = value1;
    returnType_2 paramB  = value2;
    returnType_3 paramC  = value3;
}

void className::functName1_testName2_paramB()
{
    some_code;
    /* comment */
    returnType_1 paramA  = value1;
    returnType_2 paramB  = value2;
    returnType_3 paramC  = value3;
}

void className::functName2_testName1_paramA()
{
    some_code;
    /* comment */
    returnType_1 paramA  = value1;
    returnType_2 paramB  = value2;
    returnType_3 paramC  = value3;
    returnType_4 paramD  = value4;
}

Я пытаюсь достичь

IF (functName1 && testName1 && paramA are found/matched) THEN
   IF (returnType_1 && paramA are found/matched in nth line below above match) THEN
      replace value1 with actualValue1;

IF (functName1 && testName2 && paramB are found/matched) THEN
   IF (returnType_2 && paramB are found/matched in nth line below above match) THEN
      replace value2 with actualValue2;

IF (functName2 && testName1 && paramA are found/matched) THEN
   IF (returnType_1 && paramA are found/matched in nth line below above match) THEN
      replace value1 with actualValue1;

и т. Д. И т. П.

У меня есть шаблоны с несколькими комбинациямиразные functNames, testNames, params и returnTypes, так что я хотел бы иметь возможность сопоставить его, как указано выше.

Я думал об использовании

sed '/functName1/ { n; n; n; s/value1/actualValue1/; }' fileName

Но это нене работает, потому что есть так много разных случаев, и n-ые строки различаются для разных функций. Поэтому, когда я искал ответы, казалось, что люди говорили, что awk будет лучше, чем sed для подобных вещей, но я не мог найти то, что хотя бы отдаленно похоже на мой случай.

Я предполагаю, что есть способ сделать это, но я не уверен. Так что я думаю, вопрос в том, возможно ли что-то подобное с awk или sed?

Я не против написать команду awk / sed несколько раз, так что если кто-то может датья пример и синтаксис использования этой команды awk / sed, я мог бы просто применить концепцию и написать остальное.

Я действительно ценю ваше время и заранее благодарю вас.

Ожидаемый результат будет примерно таким:

void className::functName1_testName1_paramA()
{
     some_code;
    /* comment */
    returnType_1 paramA  = actualValue1;  //after being replaced
    returnType_2 paramB  = value2;
    returnType_3 paramC  = value3;
}

void className::functName1_testName2_paramB()
{
    some_code;
    /* comment */
    returnType_1 paramA  = value1;
    returnType_2 paramB  = actualValue2;  //after being replaced
    returnType_3 paramC  = value3;
}

void className::functName2_testName1_paramA()
{
    some_code;
    /* comment */
    returnType_1 paramA  = actualValue1; //after being replaced
    returnType_2 paramB  = value2; 
    returnType_3 paramC  = value3;
    returnType_4 paramD  = value4;
}

1 Ответ

1 голос
/ 17 октября 2019

Не могли бы вы попробовать, полностью на основе только показанных образцов.

awk '
!NF{
  found_func2_test1_parama=found_func2_test1_paramb=found_func1_test1_parama=""
}
/functName1_testName1_paramA/{
  found_func1_test1_parama=1
}
/returnType_1 paramA/ && found_func1_test1_parama{
  $NF="actualValue1;"
  sub(/returnType/,"    &")
  print
  next
}
/functName2_testName1_paramB/{
  found_func2_test1_paramb=1
}
found_func2_test1_paramb && /returnType_2 paramB/{
  $NF="actualValue2;"
  sub(/returnType/,"    &")
  print
  next
}
/functName2_testName1_paramA/{
  found_func2_test1_parama=1
}
found_func2_test1_parama && /returnType_1 paramA/{
  $NF="actualValue1;"
  sub(/returnType/,"    &")
  print
  next
}
1
'   Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...