Macos Sed regex,在Mac终端中提取字符串的一部分
我有像“(东西/东西)”这样的样本数据,我正试图提取“东西” 我在OSX上的终端上做这件事,但我似乎不能完全正确 这是最后一次失败的尝试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) 注意:我使用@作
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
是第三个字段,因为行以字段分隔符开头,这意味着字段1(thing
)是它前面的空字符串)$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'`
还请注意,这两个命令与GNUsed
一样工作,因此问题不是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.:这两个命令在GNUsed
中的工作方式相同(但请注意,激活ERE的-E
选项是更为人所知的-r
的别名)。+1作为答案(如果输入不仅仅包含(stuff/thing)
)和解释,则可能会很脆弱。同时感谢您改进我的回答Good!请注意,使用另一个分隔符可能会提高可读性