#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, о, хорошо, понял, теперь я исправил регулярное выражение, добавив в него границы слов, код теперь работает с вашими показанными примерами, пожалуйста, проверьте его один раз и дайте мне знать.