2012-04-18 90 views
4

輸入文件提取特定發生的引號之間的字符串在UNIX

.. 
set name "old name"; # comment "should be updated" 
.. 

輸出文件

.. 
set name "new name" ; #comment "should be updated" 
.. 

當我試圖用grep引號之間的內容與第一之間grep -i 'name' inputfile | grep -P \".+{\"}其grepping內容「和最後一個「

ie old name"; # comment "should be updated

任何想法使用grepsedawk來完成!

回答

8

目前尚不清楚你想要做什麼。首先,您的grep命令包含一個大括號,而輸入不包含。此外,您似乎希望根據您的輸入和輸出進行比較來進行替換。

但是,從字面上考慮您的問題,這裏是您如何才能grep引號之間的字符串。您可以使用非貪婪匹配:

grep -Po '".*?"' 

例子:

$ echo 'set name "username"; # comment "should be updated"' | grep -Po '".*?"' 
"username" 
"should be updated" 

編輯:

爲了替換一個值,你可以使用sed。你不會使用grep

sed 's/"[^"]*"/"new name"/' 

例子:

$ echo 'set name "old name"; # comment "should be updated"' | sed 's/"[^"]*"/"new name"/' 
set name "new name"; # comment "should be updated" 
+0

謝謝,它的幫助,現在更新了我的問題,希望現在清楚,如果我們將grep的輸出傳遞給sed/awk,我們可以訪問它的變量!以便我們可以用其他字符串替換grep的輸出並回寫 – user1228191 2012-04-18 16:43:02

+1

@ user1228191:請參閱我編輯的答案。 – 2012-04-18 16:50:05

+1

@ user1228191,注意用於實現非貪婪匹配的技巧:引用,然後儘可能多的非引號字符,然後再引用另一個引號('「[^」] *「') – 2012-04-18 18:40:35

6

桑達:

sed 's/[^"]*"\([^"]*\)".*/\1/' 

awk中:

awk -F'"' '{ print $2 }' 
+0

太感謝了,我們才能重新定向,對於更換grepped輸出,對不起,我是個新手,剛學的東西! – user1228191 2012-04-18 15:35:34

+0

我的意思是,如果我們將grep的輸出傳給sed/awk,我們就可以訪問它! – user1228191 2012-04-18 15:48:04

1

我認爲should be後半句應該是新的用戶名

sed 's/^\([^"]\+"\)[^"]\+\(.*should be \)\([^"]\+\)/\1\3\2\3/' 

與GNU有點整潔的sed

sed -r 's/^([^"]+")[^"]+(.*should be)([^"]+)/\1\3\2\3/' 

編輯 - 丹尼斯有一個很好的答案。如果新名字保存在shell變量中,則可以使用引號技巧:

new_name="Fred" 
sed 's/"[^"]*/"'"$new_name"'"/' 
+0

對不起,我的錯,我不是那個意思..新的用戶名可以是任何東西..謝謝你回答 – user1228191 2012-04-18 15:41:59

+0

如果我們將grep的輸出傳給sed/awk,我們可以訪問它! – user1228191 2012-04-18 15:48:19

+0

現在更新了我的問題,請您再檢查一次! – user1228191 2012-04-18 16:45:01

相關問題