2010-02-16 34 views
4

我一直在試圖給grep一個確切的殼「變量」用字邊界,我怎樣才能從shell變量grep的值?

grep "\<$variable\>" file.txt 

但沒有設法;我嘗試了其他一切,但沒有成功。

其實我從一個Perl腳本調用grep

$attrval=`/usr/bin/grep "\<$_[0]\>" $upgradetmpdir/fullConfiguration.txt` 

$_[0]$upgradetmpdir/fullConfiguration.txt包含一些匹配的 「文本」。

但操作後$attrval爲空。

+2

「<" and ">」都沒有任何的grep我熟悉的單詞邊界。這是什麼操作系統?你對字面意義上的「$ variable」感興趣還是對它的shell擴展感興趣?你用「shell」和「perl」標記了這個;這是什麼? –

+0

我已經更新了這個問題,看看。 – Gaurav

+3

您必須擔心反斜槓被解釋了多少次。 Perl正在剝離反斜槓; 'grep'看到的參數不包含任何反斜槓。您需要將Perl代碼中的反斜槓加倍以獲得所需的效果。 –

回答

4

@OP,你應該在Perl中做'grepping'。除非沒有選擇,否則不要不必要地調用系統命令。

$mysearch="pattern"; 
while (<>){ 
chomp; 
@s = split /\s+/; 
foreach my $line (@s){ 
    if ($line eq $mysearch){ 
     print "found: $line\n"; 
    } 
} 
} 
+1

相當。特別是使用系統命令時,您不得不擔心安裝了哪個版本的命令。 Perl會讓這些擔憂消失。 –

0

使用單引號工作對我來說在tcsh

grep '<$variable>' file.txt 

我假設你的輸入文件中包含的文字串:<$variable>

+0

這不會擴展用戶請求的'$ variable' 。它還需要確切的字符串,在文本之後加上'<'之前和'>'。 –

+0

我認爲Guaurav需要顯示他的輸入文件的一個小樣本,他所需的輸出,並確認'$ variable'應該被shell擴展。當更多細節可用時,我會更新我的答案。 – toolic

+0

我已經更新了這個問題,看看。 – Gaurav

0

如果variable=foo你想grep爲「富」?如果是這樣,它適用於我。如果您要爲名爲「$ variable」的變量設置grep,請將引號更改爲單引號。

+0

試圖grep for'foo',但不顯示'食物'。 –

+0

@Jonathan:我知道。它適用於我使用GNU grep 2.5.4 –

1

我沒有看到這裏的問題:

file.txt的:

hello 
hi 
anotherline 

現在,

[email protected] ~ $ export GREPVAR="hi" 
[email protected] ~ $ echo $GREPVAR 
hi 
[email protected] ~ $ grep "\<$GREPVAR\>" file.txt 
hi 

到底是不是有什麼工作適合你?

+0

我已經更新了這個問題,看看。 – Gaurav

+0

啊,我的道歉 – Mala

0

在最近的linux上,它按預期工作。可以試試egrep而不是

1

不是每個grep都支持ex(1)/ vi(1)字邊界語法。

我想我會只是做:

grep -w "$variable" ... 
+0

我想你可能打算在那裏用雙引號。 –

0

說你有

$ cat file.txt 
This line has $variable 
DO NOT PRINT ME! $variableNope 
$variable also 

然後用下面的程序

#! /usr/bin/perl -l 

use warnings; 
use strict; 

system("grep", "-P", '\$variable\b', "file.txt") == 0 
    or warn "$0: grep exited " . ($? >> 8); 

你會得到輸出的

This line has $variable 
$variable also

它使用匹配Perl正則表達式的-P switch to GNU grep。該功能仍處於試驗階段,請小心操作。

還要注意使用繞過shell引用的system LIST,允許程序使用Perl的引用規則而不是shell指定參數。

您可以使用-w(或--word-regexp)開關,如

system("grep", "-w", '\$variable', "file.txt") == 0 
    or warn "$0: grep exited " . ($? >> 8); 

得到相同的結果。

0

使用單引號它不會工作。你應該去雙引號

例如:

this wont work 
-------------- 
for i in 1 
do 
grep '$i' file 
done 

this will work 
    -------------- 
    for i in 1 
    do 
    grep "$i" file 
    done