这是一个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
的行,因此-n
与grep
)
grep -n "not found" < textfile.log | sed -n 's/.*\(\'.*\'\).*/\1/p'
有了这个,我收到两个错误:第一,它在搜索'
时到达文件末尾,第二,文件结尾是意外的。
我也试过
grep -n "not found" < textfile.log | sed -n 's/.*[\']\(.*\)[\'].*/\1/p'
只能在没有引号的单引号中获取单词。只有同样的错误。
感谢您的帮助。
答案 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