2012-11-03 21 views
3

我有类似这样猛砸使用grep的中/剪切命令行情中的脚本

grep -oP "data-context-item-title=.*.data-context-item-id" web.html | cut -d'"' -f2 

我知道这行正确工作,因为我用它在终端上一条线,它给了我所需的输出。但是,我想把这一行放在一个bash脚本中。所以我有这个迄今为止

title="$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)" 

这是一个问题,因为它匹配的第一个“(引号)与切割的”(引号)。无论如何要避免它?

输出,无需切换功能与此类似

data-context-item-title="Some long title" data-context-item-id 
data-context-item-title="Another very long title" data-context-item-id 

东西记住,我不能使用任何awk或者sed命令来替换晋级。

感谢

回答

3

右括号既然你使用bash,这将是足够安全的使用方法:

title=$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2) 

这将在变量保持内部空间(尤其是新行),正如你可以看到,如果你做的事:

echo "$title" 

我认为,如果你设法找到了UNIX™7 版Bourne Shell中使用,则忽略周围的$(...)符号双引号(或者,更准确地说,在`...`符号)不会是安全的,但它似乎在现代炮弹上安全工作(比如最近在本世纪更新的炮弹,而不是前一炮炮弹)。困难在于找到一个老伯恩壳牌来验证我现在摇摇欲坠的(因为遥远的)回忆。

不过,我的问题是,在Mac OS X 10.7.5上运行的是bash 3.2(系统)和4.2(自制)两种版本,您的代码对于我来说都是正确工作的,无论是否带有双引号$(...)。您正在使用哪个版本的bash,以及在哪个平台上?

+0

我第二个问题是什么版本的bash这是。并且要清楚:重要的问题是运行脚本的bash版本是什么,它可能与交互式使用的版本不同。 –

0

在切割分隔符的参数是一个双引号不是单一的。使用间隙逃实际报价

+0

我我不确定你的意思。我有意使用双引号作为分隔符。 – user1709294

+0

对不起。我的意思是你尝试切-d“\“” – cowboydan

0

不知道这是一个错字或没有,但你似乎已经忘记了$(...)

+0

是啊,这是一个错字,刚刚修好了 – user1709294

+0

这样做的第一'‘'仍然匹配切的'’'?行工作正常我的机器上。 – doubleDown

+0

是的,它仍然匹配第一个“with cut's”。当我制作更多行代码时,它认为它们都在引用中,并且从未终止。 – user1709294

0

野建议:是否有可能在你的命令中的引号的一个不是纯ASCII报价,但某种奇特的Unicode报价(该外壳将无法识别)的?

0

首先,解决了错误逃避cut双引号:

title="$(... | cut -d \" ...)" 

但是,你用grep的PCRE,这样你就可以使用lookarounds拖放完全切割:

title=$(grep -oP '(?<=data-context-item-title=").*?(?=" data-context-item-id)' web.html)