在bash中使用中间或行尾提取单词

时间:2014-12-17 20:19:33

标签: regex bash sed

我知道那里有数百个类似的帖子,我尝试了很多东西,但是我无法得到它。我想从开始-D的字符串中提取一个单词。例如:

This is foo -Dbar,barOne the end

应该打印

-Dbar,barOne

这就是我所拥有的:

sed -n 's/.*\-D\(.*[\s\|$]\)/\1/p'

这不是唯一的正则表达式,我已经尝试了很多这方面的变化但是其中一个不起作用。例如,一旦我能够获得输出,如果-D是最后一个单词但是不起作用,则它在中间,一旦它在中间工作,如果它在中间则没有,如果它在最后。我在这里做错了什么?

4 个答案:

答案 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}'
  1. /-D/仅匹配-D
  2. {启动命令组
  3. s/.*-D/-D/删除任何内容到-D
  4. s/ .*$//删除第一个空格后的所有内容
  5. p打印