String 如何提取字符串后面的第一个单词?

String 如何提取字符串后面的第一个单词?,string,parsing,bash,String,Parsing,Bash,例如,假设我有一个文本文件example.txt,其内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是一只好狗 既然“乔治”是“我最喜欢的狗是”之后的第一个单词,那么我该如何提取它呢 如果有多个空间,例如。 我最喜欢的狗是乔治 有没有一种方法可以可靠地提取单词“George”,而不管“我最喜欢的狗是”和“George”之间有多少空格 您可以执行以下操作: cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/

例如,假设我有一个文本文件example.txt,其内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是一只好狗

既然“乔治”是“我最喜欢的狗是”之后的第一个单词,那么我该如何提取它呢

如果有多个空间,例如。 我最喜欢的狗是乔治

有没有一种方法可以可靠地提取单词“George”,而不管“我最喜欢的狗是”和“George”之间有多少空格

您可以执行以下操作:

cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/g'

它输出
Geroge

如果未安装perl,则可以使用sed:

cat example.txt | sed 's/my favourite dog is *\([a-zA-Z]*\) .*/\1/g'
纯Bash:

string='blah blah ! HEAT OF FORMATION 105.14088 93.45997 46.89387 blah blah'
pattern='HEAT OF FORMATION ([^[:blank:]]*)'
[[ $string =~ $pattern ]]
match=${BASH_REMATCH[1]}

如果您试图搜索一个文件,特别是如果您有一个大文件,那么使用诸如sed/awk/perl之类的外部工具比使用纯bash循环和bash字符串操作要快

sed 's/.*HEAT OF FOMATION[ \t]*\(.[^ \t]*\).*/\1/'  file

纯bash字符串操作只有在处理脚本中的几个简单字符串时才有效。就像操纵变量一样。

谢谢!如果我想从这些废话中提取105.15088呢!生成热105.14088 93.45997 46.89387诸如此类你可以试试
cat输入| perl-pe's/诸如此类!生成热\s+(\s+)\s.*/\1/g'
对猫的无用使用(两次)。谢谢。我想问一下,使用bash(sed)、pearl或其他什么方法,哪种方法最快?我不确定,但我想,对于较小的文件,sed比perl更快,因为启动速度更快。对于较大的文件,我不知道。@Feynman:
sed
与Bash没有任何关系,反之亦然,
sed
是一个可以由shell生成的程序,Bash是一个shell。但是,您可以使用Bash来进行字符串提取(参见我的答案)。