我知道那里有数百个类似的帖子,我尝试了很多东西,但是我无法得到它。我想从开始-D
的字符串中提取一个单词。例如:
This is foo -Dbar,barOne the end
应该打印
-Dbar,barOne
这就是我所拥有的:
sed -n 's/.*\-D\(.*[\s\|$]\)/\1/p'
这不是唯一的正则表达式,我已经尝试了很多这方面的变化但是其中一个不起作用。例如,一旦我能够获得输出,如果-D
是最后一个单词但是不起作用,则它在中间,一旦它在中间工作,如果它在中间则没有,如果它在最后。我在这里做错了什么?
答案 0 :(得分:2)
这可能会对您有所帮助:
kent$ echo "This is foo -Dbar,barOne the end"|sed 's/.*\(-D\S*\).*/\1/'
-Dbar,barOne
答案 1 :(得分:2)
使用纯BASH:
s='This is foo -Dbar,barOne the end'
[[ "$s" =~ (-d[^[:space:]]+) ]]; echo "${BASH_REMATCH[1]}"
-Dbar,barOne
-d
匹配文字-d
[^[:space:]
- 匹配任何空间[^[:space:]]+
匹配1个或多个非空格(相当于\S+
)(-d[^[:space:]]+)
在捕获的组#1 &&
仅在上一次成功时执行下一个命令echo "${BASH_REMATCH[1]}"
打印捕获的组#1 答案 2 :(得分:2)
以下是awk
版本:
awk '/-D/' RS=" " file
-Dbar,barOne
gnu awk
版本(由于RS中有多个字符)
awk 'NR==2 {print RS$1}' RS="-D" file
-Dbar,barOne
答案 3 :(得分:1)
我就是这样做的。
sed -n '/-D/{s/.*-D/-D/;s/ .*$//;p}'
/-D/
仅匹配-D
{
启动命令组s/.*-D/-D/
删除任何内容到-D s/ .*$//
删除第一个空格后的所有内容p
打印