【发布时间】:2011-04-02 18:26:21
【问题描述】:
例如,假设我有一个文本文件 example.txt,内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是条好狗。
现在我如何提取“乔治”,因为它是“我最喜欢的狗是”之后的第一个词?
如果有多个空格怎么办,例如 我最喜欢的狗是乔治.....
无论“我最喜欢的狗是”和“乔治”之间有多少空格,有没有办法可靠地提取“乔治”这个词?
【问题讨论】:
例如,假设我有一个文本文件 example.txt,内容如下: 我喜欢狗。 我最喜欢的狗是乔治,因为他是我的狗。 乔治是条好狗。
现在我如何提取“乔治”,因为它是“我最喜欢的狗是”之后的第一个词?
如果有多个空格怎么办,例如 我最喜欢的狗是乔治.....
无论“我最喜欢的狗是”和“乔治”之间有多少空格,有没有办法可靠地提取“乔治”这个词?
【问题讨论】:
如果您尝试搜索文件,尤其是当您有一个大文件时,使用 sed/awk/perl 等外部工具比使用纯 bash 循环和 bash 字符串操作要快。
sed 's/.*HEAT OF FOMATION[ \t]*\(.[^ \t]*\).*/\1/' file
纯 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]}
【讨论】:
如果你没有安装 perl,你可以使用 sed:
cat example.txt | sed 's/my favourite dog is *\([a-zA-Z]*\) .*/\1/g'
【讨论】:
sed 与 Bash 没有任何关系,反之亦然,除了 sed 是一个可以由 shell 生成的程序而 Bash 是一个 shell。但是,您可以使用 Bash 进行字符串提取(请参阅我的回答)。
你可以这样做:
cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/g'
它输出Geroge
【讨论】:
cat input | perl -pe 's/blah blah ! HEAT OF FORMATION\s+(\S+)\s.*/\1/g'
cat 的无用使用(两次)。