regex - 从两行之间的文件中提取一个 block

标签 regex linux bash sed

我有一个包含这个的文件/输出:

igw_id = igw-96788cf1
private_route_tables_ids = [
    rtb-c2adcda4,
    rtb-c5a3c3a3,
    rtb-c4adcda2
]
private_subnets_cidrs_ipv4 = [
    10.20.10.0/24,
    10.20.11.0/24,
    10.20.12.0/24
]
private_subnets_ids = [
    subnet-6057333b,
    subnet-6be7bf0c,
    subnet-f13419b8
]
public_route_tables_ids = [
    rtb-74a9c912,
    rtb-c5adcda3,
    rtb-2aabcb4c
]
public_subnets_cidrs_ipv4 = [
    10.20.0.0/24,
    10.20.1.0/24,
    10.20.2.0/24
]
public_subnets_ids = [
    subnet-6157333a,
    subnet-17e7bf70,
    subnet-303f1279
]

我想提取所有公共(public)子网 ID 并在不带空格的情况下打印它们。

我使用了这个正则表达式

sed -n '/public_subnets_ids/{:a;N;/\]/!ba;s/[[:space:]]//g;s/,/\n/g;s/.*public_subnets_ids\|\].*//g;p}' my_file.txt

输出是:

=[subnet-6157333a
subnet-17e7bf70
subnet-303f1279

但我想得到这个:

subnet-6157333a
subnet-17e7bf70
subnet-303f1279

事实上,我告诉 sed 什么都不要替换空格和换行符 (s/[[:space:]]//g) 然后它也替换第一个新行,然后带来第一个子网向上,所以我会在第一个换行符之后和尝试此操作时处理正则表达式

sed -n '/public_subnets_ids = \[[\n\r\s]+\\n/{:a;N;/\]/!ba;s/[[:space:]]//g;s/,/\n/g;s/.*public_subnets_ids\|\].*//g;p}' my_file.txt

它没有输出,意味着它不匹配任何东西。

请帮助改进上述正则表达式以仅在单独的行中提供子网 ID?

最佳答案

awk 助您一臂之力!

$ awk '/^]/{f=0} f{$1=$1; sub(",",""); print} 
       /public_subnets_ids/{f=1}' file

subnet-6157333a
subnet-17e7bf70
subnet-303f1279

关于regex - 从两行之间的文件中提取一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229738/

相关文章:

regex - 用于查找单词 A 和单词 B 之间的文本字符串的脚本。findstr、正则表达式或替代方案

linux - 防止将jsch命令写入历史记录

c++ - 无需 fork/exec、popen() 和 system() 即可获取 linux 信息

linux - 如果 read var 为空,则返回以在 bash 中再次提问

linux - 如何使用 UNIX bash 脚本变量从条件语句中的 date 命令分配值

regex - 如何从选择中排除可变模式

c# - 带正则表达式的匹配表

javascript - 如何为JSON对象中的每个叶节点生成JSON路径?

linux - 如何连接到 vmplayer guest 操作系统上托管的网络服务器?

bash - 在.env中使用空格设置变量