linux sed如何从提取的输出中删除括号

时间:2017-01-26 18:00:38

标签: linux shell sed

我想从字符串

中提取 10000
echo "some ran string (unique unique 10000) abc 161 xyz 100"

我无法确定如何删除结尾。下面是我到目前为止尝试的sed命令:

sed -n -r 's/.*unique(.*) abc .*/\1/p'

输出结果为:

 echo "some ran string (unique unique 10000) abc 161 xyz 100" | sed -n -r 's/.*unique(.*) abc .*/\1/p'
 10000)

有关如何删除结尾的任何建议)和此输出中的前导空格?感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用以下sed命令,该命令与右括号前的非空格字符匹配:

sed 's/.*\s\([^\s]*\)).*/\1/'

匹配:

.*        any character zero or more times
\s        a space
\(        begin of capturing group 1
[^\s]*    non space characters zero or more times (the number)
\)        end of capturing group 1
)         ) after the number
.*        any character zero or more time (the remain of the line)

因为模式开头和结尾的.*它将匹配整行。它取代了:

\1        The content of capturing group 1 (the number)

如评论中所示,由于\s转义序列(对于空格),上述版本与POSIX不兼容。对于与POSIX兼容的版本,您可以只使用文字空间:

sed 's/.* \([^ ]*\)).*/\1/'

或使用[:space:]字符类:

sed 's/.*[[:space:]]\([^[:space:]]*\)).*/\1/'

顺便说一句,如果你有GNU grep,你可以使用Perl正则表达式。 Perl正则表达式支持look-ahead assertions。像这样:

grep -oP '\d+(?=\))'

说明:

-o        output the match only, not the whole line that contains the match
-P        Perl compatible regexes. GNU grep only!

\d+       one ore more digits
(?=\))    look-ahead assertion. Means 'previous pattern is followed by a )'

答案 1 :(得分:2)

awk救援!

$ echo "some ran string (unique unique 10000) abc 161 xyz 100" | 
  awk -v RS=')' '/unique/{print $NF}'

10000