Как сопоставить регулярное выражение для кода между фигурными скобками

#bash #awk #sed #grep

#bash #awk #sed #grep

Вопрос:

Мне нужно сопоставить весь блок, содержащий эту строку

   role = "${module.iam_basic.ec2_base_instance_role}"
 

Мой файл выглядит так

 module "iam_basic" {
 source = "../../../../modules/aws/iam/ec2"
 base_profile = "staging_srv_profile"
 base_role = "staging_srv_role"
}
resource "aws_iam_role_policy" "s3_bucket_policy" {
name = "s3-policy"
role = "${module.iam_basic.ec2_base_instance_role}"
policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement":[
 {
   "Effect":"Allow",
   "Action":"s3:*",
   "Resource":["arn:aws:s3:::stg-access/*",
              "arn:aws:s3:::stg-access"]

  }
 ]
}
EOF
}
 

Таким образом, регулярное выражение должно совпадать

 resource "aws_iam_role_policy" "s3_bucket_policy" {
name = "s3-policy"
role = "${module.iam_basic.ec2_base_instance_role}"
policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement":[
 {
   "Effect":"Allow",
   "Action":"s3:*",
   "Resource":["arn:aws:s3:::stg-access/*",
              "arn:aws:s3:::stg-access"]

  }
 ]
}
EOF
}
 

Я пытался создать регулярное выражение, я придумал это:

 /^(.*?){([^}]*)}/gm
 

но оно не соответствует должным образом, пожалуйста, помогите мне, если у вас есть какой-либо другой подход, например, использование таких инструментов, как grep, awk, sed и т. Д

Комментарии:

1. Пожалуйста, добавьте свой попытанный код в свой вопрос, что настоятельно рекомендуется в SO, спасибо.

2. Не могли бы вы уточнить: вы хотите сопоставить role = "${module.iam_basic.ec2_base_instance_role}" и начать печатать все строки после этой совпадающей строки? Всегда ли эта строка role = "${module.iam_basic.ec2_base_instance_role}" будет иметь одинаковый формат, если нет, то в каком другом формате это может быть? Пожалуйста, подробнее остановитесь на этих моментах, спасибо.

3. @RavinderSingh13 Привет, я хочу сопоставить весь блок, содержащий эту строку, и да, эта строка всегда будет в том же формате.

Ответ №1:

Основываясь только на показанных вами примерах, не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное в GNU awk .

 awk '
/^module "/{
  if(found){ print val }
  found=""
}
/<role = "${module.iam_basic.ec2_base_instance_role}"/{
  found=1
}
{
  val=(val?val ORS:"")$0
}
END{
  if(found){ print val }
}' Input_file
 

Пояснение: Добавление подробного объяснения для приведенного выше.

 awk '                        ##Starting awk program from here.
/^module "/{                 ##Checking condition if line starts from module " then do following.
  if(found){ print val }     ##Checking condition if found is SET then print the val.
  found=""                   ##Nullify found here.
}
/^role = "${module.iam_basic.ec2_base_instance_role}"/{ ##Check if line has mentioned pattern in it shown by OP.
  found=1                    ##Set found to 1 here.
}
{
  val=(val?val ORS:"")$0     ##Creating val and keep appending current line values to it.
}
END{                         ##Starting END block of this program from here.
  if(found){ print val }     ##Checking condition if found is SET then print the val.
}' Input_file                ##Mentioning Input_file name here.
 

Комментарии:

1. Привет, я попробовал, но, к сожалению, у меня это не сработало, вот вывод del.dog/resultregex.txt

2. @Ayushwalia, для ваших данных образцов это сработало нормально для меня, ваши фактические данные такие же, как показанные образцы?

3. Вот один из файлов del.dog/regexfile.txt , необходимо сопоставить 2-й, 3-й и 4-й блоки, поскольку в них есть эта строка роли

4. @Ayushwalia, о, хорошо, понял, теперь я исправил регулярное выражение, добавив в него границы слов, код теперь работает с вашими показанными примерами, пожалуйста, проверьте его один раз и дайте мне знать.