2010-08-23 93 views
0

例如,假设我有一个文本文件example.txt,其内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是一只不错的狗。如何提取字符串后面的第一个单词?

现在我怎么提取“乔治”,因为它是“我最喜爱的狗”之后的第一个单词?

如果存在多于一个空间,例如 我最喜欢的狗是乔治.....

无论“我最喜爱的狗是”还是“乔治”之间的空格数量,有没有办法可靠地提取单词“乔治”?

回答

0

你可以这样做:

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

它输出Geroge

+0

谢谢!如果我想从 等等提取105.15088那么怎么办?等等吧!!热的形成105.14088 93.45997 46.89387 等等等等 – Feynman 2010-08-23 17:57:52

+0

你可以尝试'猫输入| perl -pe's/blah blah!形成的热\ s +(\ s +)\ s。*/\ 1/g'' – codaddict 2010-08-23 18:02:34

+0

无用的'cat'(两次)。 – 2010-08-23 18:59:20

1

如果您没有安装perl的,你可以使用SED:

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

谢谢。我可以问一下这是最快的 - 使用bash(sed),pearl还是别的东西? – Feynman 2010-08-23 18:13:07

+0

我不知道,但我会猜测,由于更快的启动,sed比perl更小的文件更快。对于较大的文件,我不知道。 – 2010-08-23 18:41:37

+0

@Feynman:'sed'与Bash没有任何关系,反之亦然,除了'sed'是一个shell可以产生的程序,Bash是一个shell。但是,您可以使用Bash来进行字符串提取(请参阅我的答案)。 – 2010-08-23 18:58:06

1

纯击:

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]} 
0

如果你想搜索一个文件,尤其是如果你有一个大文件的话,使用像sed/awk/perl这样的外部工具比使用纯粹的bash循环和bash字符串操作要快。

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

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

相关问题