Macos Sed regex,在Mac终端中提取字符串的一部分

Macos Sed regex,在Mac终端中提取字符串的一部分,macos,sed,Macos,Sed,我有像“(东西/东西)”这样的样本数据,我正试图提取“东西” 我在OSX上的终端上做这件事,但我似乎不能完全正确 这是最后一次失败的尝试 echo '(stuff/thing)' | sed -n 's/\((.*)\)/\1/p' 我想说: $ echo '(stuff/thing)' | sed -n 's@.*/\([^)]*\))@\1@p' thing 我开始说: $ echo '(stuff/thing)' | sed -n 's@.*/@@p' thing) 注意:我使用@作

我有像“(东西/东西)”这样的样本数据,我正试图提取“东西”

我在OSX上的终端上做这件事,但我似乎不能完全正确

这是最后一次失败的尝试

echo '(stuff/thing)' | sed -n 's/\((.*)\)/\1/p'
我想说:

$ echo '(stuff/thing)' | sed -n 's@.*/\([^)]*\))@\1@p'
thing
我开始说:

$ echo '(stuff/thing)' | sed -n 's@.*/@@p'
thing)
注意:我使用
@
作为sed分隔符,以提高可读性

然后,我想摆脱来自
的东西。为此,我们必须使用
\([^]*\)
捕获块,然后使用
\1
将其打印回来

因此,这一切都在做:

#打印捕获的组
#                ^^
#                | 
.*/\([^)]*\))@\1
#  ^^^| ^^^^^ |
#| |---------------除了
#   | |       |
#   | ^^     ^^
#|捕获组
#   |
#每件事都达到一个标准/

我可以分两个简单的部分来完成这项工作-删除斜杠之前的所有内容,包括斜杠,然后删除右括号之后的所有内容:

echo '(stuff/thing)' | sed -e 's/.*\///' -e 's/).*//'

要提供awk替代方案,请执行以下操作:

awk
使基于分隔符将行解析为字段变得容易:

$ echo '(stuff/thing)' | awk -F'[()/]' '{print $3}'
thing
  • -F[()/]
    指定在将每个输入行拆分为字段时,任何字符
    /
    都应用作字段分隔符
  • $3
    指第三个字段(
    thing
    是第三个字段,因为行以字段分隔符开头,这意味着字段1(
    $1
    )是它前面的空字符串)

至于为什么您的
sed
命令不起作用

因为您没有使用
-E
,所以必须使用基本正则表达式(BRE),在这里,与直觉相反,括号必须转义为特殊的-您的情况正好相反

然而,主要的问题是,为了只输出行的一部分,您必须匹配所有行,并用感兴趣的部分替换它

使用BRE,即:

echo '(stuff/thing)' | sed -n 's/^.*\/\(.*\))$/\1/p'
echo '(stuff/thing)' | sed -En 's/^.*\/(.*)\)$/\1/p'`
使用ERE(扩展正则表达式),它将是:

echo '(stuff/thing)' | sed -n 's/^.*\/\(.*\))$/\1/p'
echo '(stuff/thing)' | sed -En 's/^.*\/(.*)\)$/\1/p'`
还请注意,这两个命令与GNU
sed
一样工作,因此问题不是Mac特定的(但请注意,用于激活ERE的
-E
选项是更知名的
-r
的别名)。

也就是说,regex方言在不同的实现中确实有所不同;GNU
sed
通常支持对POSIX强制执行的BRE和ERE的扩展。

两个快速提示:由于您没有使用
-E
,因此必须使用基本正则表达式(BRE),其中,与直觉相反,括号必须转义为特殊的-您的情况正好相反。主要问题是,为了只输出行的一部分,您必须匹配所有行,并用感兴趣的部分替换它。使用BRE,这将是
echo'(stuff/thing)| sed-n的/^.\/\(.*)$/\1/p'
;对于ERE(扩展正则表达式),这将是:
echo'(stuff/thing)| sed-En/^.*/(.*)$/\1/p'
p.s.:这两个命令在GNU
sed
中的工作方式相同(但请注意,激活ERE的
-E
选项是更为人所知的
-r
的别名)。+1作为答案(如果输入不仅仅包含
(stuff/thing)
)和解释,则可能会很脆弱。同时感谢您改进我的回答Good!请注意,使用另一个分隔符可能会提高可读性