2012-12-10 46 views
2

我有一个像sed将两种模式

1 name1 Pending flag0 
    2 name2 Completed flag1 
    3 name3 Completed flag- 

等在文件script.sh表达式的列表之间的grep串,

我想给grep“1”之间的特殊地位和“等待“(即name1)。

我试图用这个命令

var="1" 

    cat script.sh |sed -n "s/^${var}\(.*\)Pending.*$/\1/gp" 

这并不返回任何东西。

+0

这对我很有用。文件中的行之前或之后是否有空格? – chrisaycock

+0

是的,我发现它不工作,当我使用变量替换 –

+0

嗯,即使你的例子与一个变量适用于我。 – chrisaycock

回答

0

您的解决方案只需要稍作修改:

var="1" 

cat script.sh | sed -n "/^${var}.*Pending/{s/^${var}\(.*\)Pending.*$/\1/;p;}" 
+0

你也应该失去猫的无用用途。 http://partmaps.org/era/unix/award.html – tripleee

+0

@tripleee:是的。另外,第二个'^'和最后''''是不必要的。 –

0
sed -n 's/^1\(.*\)Pending.*$/\1/gp' 

你在一开始

+0

谢谢!但它仍然不起作用。我现在编辑。 –

0
如何

关于解决方案得到了额外的斜线?

awk '{for (i=1; i<=NF; i++) {if ($i == "Pending") {print $(i-1)}}}' input_file 
2

这你如何做到这一点使用grep -Po '(?<=1).*(?=Pending)' file

$ cat file 
    1 name1 Pending flag0 
    2 name2 Completed flag1 
    3 name3 Completed flag- 

$ grep -Po '(?<=1).*(?=Pending)' file 
    name1 

这里是只显示遵循1比赛并且在单词Pending之前。

注意:这是使用positive lookahead and lookbehind