在Bash中提取两个字符之间的字符串

3

我需要帮助在Bash中提取 "@" 符号和空格 " " 之间的字符串。

我正在使用Python Twitter工具,输出结果如下:

430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well

我需要提取两个字符串:

SawBlastt

WereAutomatic

我还需要将它们分别设置为单独的变量。我尝试过使用sed和grep,但没有成功的结果。我真的卡在这里了。非常感谢帮助。

4个回答

5

您可以使用:

s='430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well'
grep -oP '@\K[^ ]*' <<< "$s"
SawBlastt
WereAutomatic

非常感谢。它正在运转 :D - RydallCooper
不用谢,很高兴它能够正常工作。 - anubhava
3
既然你使用了“-P”参数,那么最好使用“\w+”代替“[^ ]*”。这样做可以使语句更加简洁易懂,但不会改变原意。 - glenn jackman
可以,当然可以使用那种方式,但我不确定在 @" " 之间是用点号还是连字符。 - anubhava
1
对于那些(像我一样)不熟悉\K的人来说,这是Perl风格的正则表达式功能(由于-P grep选项而可用),它会导致到目前为止匹配的字符串被丢弃,因此是一个比后顾表达式更简单的替代方法(在这种情况下,后顾表达式将是grep -oP '(?<=@)[^ ]*')。 - mklement0

3

另一个我主要使用的gnu grep命令。

grep -Po "(?<=@)[^ ]*" file

1
BASH拥有自己的正则表达式匹配功能,可以使用。
s="430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well"
if [[ $s =~ @([A-Za-z]+)\ @([A-Za-z]+) ]]; then
    echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
fi

为了解释清楚,这里是man bash的内容:

BASH_REMATCH的第n个元素是匹配第n个括号表达式的部分字符串。


0
这将设置变量,就像OP请求的一样。
$ cat foo.txt
430438229200740352 2014-02-03 14:30:45 CST <HorizonAwon> @SawBlastt @WereAutomatic 101 for me to join as well

$ set $(awk '{print $6,$7}' FS='[ @]+' foo.txt)

$ echo $1 $2
SawBlastt WereAutomatic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接