2014-04-04 95 views
2

我從一個bash腳本得到以下輸出的bash:的grep與正則表達式

INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist 

,我想只得到用grep路徑(管家/管家-Info.plist中)。換句話說,等號後面的所有內容。任何想法如何做到這一點?

+0

你是說「我希望等號後的所有內容」?你需要'sed',而不是'grep' - 編輯行(不只是選擇它)。 – Floris

+0

是的。等號後的所有內容。 –

回答

3

此作業套房更AWK:

s='INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist' 
awk -F' *= *' '{print $2}' <<< "$s" 
MajorDomo/MajorDomo-Info.plist 

如果你真的想grep然後使用grep -P

grep -oP ' = \K.+' <<< "$s" 
MajorDomo/MajorDomo-Info.plist 
+1

您可以通過使用awk ... <<<「$ s」'而不是'echo「$ s」|來輕鬆_slightly_關於bash的問題。 awk'。 :) –

+0

......值得注意的是,'grep -P'非常非常標準,並且在幾個廣泛使用的平臺上不可用(甚至包括一些使用GNU grep的Linux發行版,因爲它不是每個編譯時選項發行版開啓)。 –

+1

這兩個有效的觀點,我寧願awk任何一天都超過grep。 – anubhava

3

你問的不完全是,但

echo "INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist" | sed 's/.*= \(.*\)$/\1/' 

會做你想要什麼。

+0

謝謝! Althogh,它仍然打印出完整的輸出形式的回聲(INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist)。 –

+0

這很奇怪 - 它正在爲我工​​作... – Floris

+0

可能需要'sed -r'來啓用ERE支持。 –

3

你可以使用cut還有:

your_script | cut -d = -f 2- 

(其中your_script做一些相當於echo INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist

如果您需要修剪開頭的空間:

your_script | cut -d = -f 2- | cut -d ' ' -f 2- 

如果你在一開始多個空格,你要修剪他們都,你將不得不回落到sed的:your_script | cut -d = -f 2- | sed 's/^ *//'(或者,更簡單,your_script | sed 's/^[^=]*= *//'

+0

輸出也將有一個空間:' MajorDomo/MajorDomo-Info.plist' – anubhava

+0

謝謝,修正。 –

+0

仍然不適用於'echo'INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist'| cut -d = -f 2- |切掉-d''-f 2''案件。 – anubhava

2

假設你的腳本輸出一個單一的線,有一個外殼唯一的解決辦法:

line="$(your_script)" 
echo "${line#*= }" 
+0

+1。因爲這個例子使用的是'key = value'而不是'key = value',所以你在這裏可能會改變的是剝離前導空白。 –

+0

謝謝,編輯。還引用它以防止多個或尾隨空格需要保留。 –

0

Bash

IFS=' =' read -r _ x <<<"INFOPLIST_FILE = MajorDomo/MajorDomo-Info.plist" 
printf "%s\n" "$x" 
MajorDomo/MajorDomo-Info.plist