我有样本数据,如"(东西/东西)"我试图提取"事情"。
我在OSX的终端上这样做,我似乎无法做到这一点。
这是最后一次破坏尝试
echo '(stuff/thing)' | sed -n 's/\((.*)\)/\1/p'
答案 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/).*//'