Sed正则表达式,在Mac终端中提取字符串的一部分

时间:2015-10-29 21:12:44

标签: macos sed

我有样本数据,如"(东西/东西)"我试图提取"事情"。

我在OSX的终端上这样做,我似乎无法做到这一点。

这是最后一次破坏尝试

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

3 个答案:

答案 0 :(得分:9)

我会说:

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

我开始说:

$ echo '(stuff/thing)' | sed -n 's@.*/@@p'
thing)

注意我使用@作为sed分隔符以提高可读性。

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

所以这一切都在做:

#                print the captured group
#                ^^
#                | 
   .*/\([^)]*\))@\1
#  ^^^| ^^^^^ |
#   | | ------|---- all but )
#   | |       |
#   | ^^     ^^
#   | capture group
#   |
#  everything up to a /

答案 1 :(得分:4)

fedorqui's helpful answer提供 awk替代

awk可以很容易地根据分隔符将行解析为字段:

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

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

由于您使用-E,您必须使用基本正则表达式(BRE),其中,反直觉,括号必须逃脱变得特别 - 你反过来了。

然而,主要问题是,为了输出部分行,您必须匹配所有行,并且将其替换为感兴趣的部分。

使用 BRE ,即:

echo '(stuff/thing)' | sed -n 's/^.*\/\(.*\))$/\1/p'

使用 ERE (扩展正则表达式),它将是:

echo '(stuff/thing)' | sed -En 's/^.*\/(.*)\)$/\1/p'`

另请注意,这两个命令与 GNU sed按原样运行,因此问题不是特定于Mac的(但请注意,激活ERE的-E选项是那里有一个别名为着名的-r) 也就是说,正则表达式方言在各种实现中都有所不同; GNU sed通常支持扩展到POSIX规定的BRE和ERE。

答案 2 :(得分:1)

我会用2个简单的部分来做 - 删除所有内容,包括斜杠,然后是从右括号开始的所有内容:

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