在单引号中与单词匹配

时间:2011-08-30 11:22:33

标签: regex bash sed

这是一个sed和RegEx初学者问题,但我无法通过Google搜索自行回答。


SZENARIO

我有一个像这样的纯文本文件作为命令的日志文件:

Checking version of 'make' >= 379... succeeded. (382)
Checking version of 'm4' >= 104... succeeded. (104)
Checking version of 'pkg-config' >= 15... succeeded. (25)
Checking version of 'autoreconf' >= 258... succeeded. (268)
Checking version of 'automake' >= 108... ./_autosetup: line 28: type: automake: not found

期望的结果

我想提取单引号中的所有单词,这些单词在行尾与not found结合使用。


我做了什么和问题

因此,我首先grep not found并将结果传递给sed :(我稍后使用not found的行,因此-ngrep

grep -n "not found" < textfile.log | sed -n 's/.*\(\'.*\'\).*/\1/p'

有了这个,我收到两个错误:第一,它在搜索'时到达文件末尾,第二,文件结尾是意外的。

我也试过

grep -n "not found" < textfile.log | sed -n 's/.*[\']\(.*\)[\'].*/\1/p'

只能在没有引号的单引号中获取单词。只有同样的错误。


感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

请改用该行:

grep -n "not found" < textfile.log | sed -n "s/.*\('.*'\).*/\1/p"

您可以在模式中使用双引号引用'(因此您不必反引用它们。)该表达式还包括引号。如果没有引号,则需要在引号内使用括号:

grep -n "not found" < textfile.log | sed -n "s/.*'\(.*\)'.*/\1/p"

但我想你已经知道了。

答案 1 :(得分:1)

我知道你问过sed,但该文件的固定字段格式也适用于其他方法:

$ grep -n "not found" textfile.log | cut -d"'" -f2
automake

请注意,您不需要使用<,因为grep可以将文件作为输入。

使用awk:

$ awk -F"'" '/not found/{print $2}' textfile.log 
automake

最后一个在bash中:

#!/bin/bash

while read; do
    if [[ $REPLY == *not\ found* ]]
    then
        set -- "$REPLY"
        IFS="'"; declare -a Array=($*)
        echo ${Array[1]}
    fi
done < textfile.log

输出:

automake

答案 2 :(得分:0)

sed -n "/not found$/ {s/^[^']*'\([^']*\).*/\1/; p}" filename