使用sed删除开头和结尾的某些字符

4
我正在尝试提取在"profile ""]"之间的单词。

我的内容

[profile gateway]
[profile personal]
[profile DA]
[profile CX]

为此我已经尝试过

less ~/.aws/config |grep  "\[profile"|sed  -E 's/\[profile(.)//'

这提供了

gateway]
personal]
DA]
CX]

我知道可以用管道和tr来删除最后一个 "]",或者使用cut命令。但是有没有人能帮我使用正则表达式修改上述的sed命令,以删除最后一个"]"字符呢?


1
我相信有更高效/复杂的解决方案,但你可以尝试在一个命令中使用3个sed命令:sed -E 's/\[//;s/\]//;s/profile //' - Cristian Ramon-Cortes
6个回答

4
你可以使用sed
sed -n 's/.*\[profile *\([^][]*\).*/\1/p' ~/.aws/config

细节:

  • -n - 阻止默认行输出
  • .*\[profile *\([^][]*\).*/ - 查找任何文本,[profile, 零个或多个空格,然后捕获零个或多个除了[]之外的字符进入第1组,并匹配剩余的文本
  • \1 - 替换为第1组的值
  • p - 打印替换的结果。

参见在线演示

s='[profile gateway]
[profile personal]
[profile DA]
[profile CX]'
sed -n 's/.*\[profile *\([^][]*\).*/\1/p' <<< "$s"

输出:

gateway
personal
DA
CX

使用GNU grep

grep -oP '(?<=\[profile )[^]]+' ~/.aws/config
(?<=\[profile )[^]]+正则表达式匹配的是一个位置,该位置紧跟着字符串profile ,然后匹配一个或多个字符,这些字符不包括]。使用-o选项可以让grep只提取匹配结果,P选项启用PCRE正则语法。 使用awk
awk '/^\[profile .*]$/{print substr($2, 0, length($2)-1)}' ~/.aws/config

它会找到所有以[profile 开头的行,并输出第二个字段但不包括最后一个字符(即将被省略的]字符)。

3
如果你可以使用带有-P参数的grep命令,并使用Perl兼容正则表达式:
less ~/.aws/config | grep -oP  "\[profile \K[^][]+(?=])"

该模式匹配:

  • \[profile 字面匹配
  • \K 忘记到目前为止匹配的内容
  • [^][]+ 匹配除了 [] 外的任意字符,至少出现1次
  • (?=]) 正向先行断言来断言(不匹配)]

对于示例内容,输出将是

gateway
personal
DA
CX

3
提取 profile ] 之间的单词意味着从 profile ] 进行删除,即使用 ^.*profile ].*$
$ sed 's/^.*profile \|\].*$//g' file

输出:

gateway
personal
DA
CX

请注意,如果只找到一个边界,则会将其删除。


3
保持在awk中的简单性; 通过将字段分隔符设置为[profile OR ](如所示示例)并根据需要输出列来打印列。
awk -F'\\[profile |\\]' '{print $2}' Input_file

2

另一个更短的 awk 解决方案:

awk -F '[] ]' '$1 == "[profile" {print $2}' ~/.aws/config

gateway
personal
DA
CX

1
尝试提取在“profile”和“]”之间的单词。同时使用awk,条件是“profile”位于$1的末尾:
awk '$1 ~ /profile$/ {sub(/]$/,"",$2);print $2}' file
gateway
personal
DA
CX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接