我有这个文件:
[default]
region = us-east-1
output = json
[profile automation]
region = us-east-1
output = json
[profile qa]
region = us-east-1
output = json
我只需要提取配置文件名称,如下所示:
default
automation
qa
到目前为止我的 sed:
gsed 's?\[[^\ ]*\ \([^\]]*\)?\1?' ~/.aws/config
当我测试时,我可以看到\([^\]]*\)
仅匹配空格后的第一个字符,例如: in a
、automation
in q
qa 等。为什么它只匹配一次?你有更好的剥离方法吗[]
?谢谢。
答案1
括号表达式内的反斜杠是文字。你要[^]]
。您的表达式[^\]]*
将匹配一个非反斜杠,后跟一个可选的]
.
$ sed -En 's/^\[(.* )?([^]]*)\]$/\2/p' file
default
automation
qa
这允许以空格结尾的可选单词作为内部的第一个子字符串[...]
,例如[group name]
。这些可选单词之后的字符串(直到]
)被捕获在第二组中。
每行的默认打印都被关闭,-n
而是在每次成功替换后显式打印。
我们需要-E
,因为?
修饰符是扩展的正则表达式修饰符。
如果没有,-E
您可以使用\{0,1\}
代替?
(并将捕获(
和分别更改)
为\(
和\)
)。
答案2
使用 GNUgrep
或兼容 PCRE 支持构建的:
grep -Po '^\h*\[\h*(\H+\h+)?\K.*[^]\h](?=\h*\]\s*$)'
我们允许有时在缩进和尾随空白中出现前导水平空白,包括 MS Windows ini 文件中常见的 CR 字符的垂直空白。
在这样的输入上:
[default]
[profile automation]
[profile a b]
[profile c d ]
它给:
default
automation
a b
c d