我想从字符串
中提取 10000echo "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)
有关如何删除结尾的任何建议)和此输出中的前导空格?感谢。
答案 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