sed:用方括号括起来的条带

sed:用方括号括起来的条带

我有这个文件:

[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 aautomationin qqa 等。为什么它只匹配一次?你有更好的剥离方法吗[]?谢谢。

答案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

相关内容