Запуск bash-скрипта, который содержит команды sed, не дает результатов и просто зависает. Почему? - PullRequest
2 голосов
/ 21 октября 2019

У меня есть пример кода и желаемый выход ниже

Образец:

void function_patternWD1()
{
   some_code;
   some_code_patternWD3;
   some_code;
}
/*some_comments_patternWD2*/

void function_patternWD4()
{
   some_code;
   some_code_patternWD6;
   some_code;
}
/*some_comments_patternWD5*/

Желаемый вывод:

void function_patternWD1()
{
   some_code;
   new_line_of_code_1;     //after sed command
   some_code_patternWD3;
   some_code;
}
/*some_comments_patternWD2*/

void function_patternWD4()
{
   some_code;
   new_line_of_code_2;    //after sed command
   some_code_patternWD6;
   some_code;
}
/*some_comments_patternWD5*/

Что я пробовал:

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}'
       -e'/patternWD4/,/patternWD5/{/patternWD6/i new_line_of_code_2;' -e '}' < "$1"
fi

Изначально я пытался

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;}' < "$1"
fi

Но это не сработало, поэтому я задал вопросздесь и автор исправил это для меня до

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}' < "$1"
fi

, который отлично работает с одной командой, но когда я использую это как в То, что я пробовал: Сценарий, кажется, не работает, поскольку он зависает, и я не вижу никаких результатов.

Может ли кто-нибудь объяснить синтаксис использования этой конкретной команды и почему моя команда не сработала, а другая сработала?

1 Ответ

2 голосов
/ 22 октября 2019

Как уже прокомментировали люди, вам не хватает обратной косой черты, чтобы сказать bash, что ваша команда занимает две строки.

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

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

С этими изменениями применимы следующие строки:

sed -e'/patternWD1/,/patternWD2/{/patternWD3/i \   new_line_of_code_1;' -e '}' \
    -e'/patternWD4/,/patternWD5/{/patternWD6/i \   new_line_of_code_2;' -e '}' <"$1"
...