2016-08-12 29 views
0

第一個字符我有這個在它測試屬性文件:我想屬性文件與桑達正則表達式 - 忽略了比賽

-config.test=false 
config.test=false 

,使用SED,更新這些屬性的值是否有在他們面前的-或不。本來我是用這個,它的工作:

sed -i -e "s/#*\(config.test\)\s*=\s*\(.*\)/\1=$(echo "true" | sed -e 's/[\/&]/\\&/g')/" $FILE_NAME 

然而,因爲我基本上是在比賽之前忽略的所有字符,我發現,當我有在同一值結束鍵的屬性,它會給我問題。如:

# The regex matches both of these 

config.test=true 
not.config.test=true 

有沒有辦法要麼忽略了比賽的第一個字符或忽略初始-特別?

編輯:

加入少許澄清一下我會想正則表達式匹配方面:

config.test=false  # Should match 
-config.test=false  # Should match 
not.config.test=false # Should NOT match 
+0

在模式開始處添加'\(^ \ | - \)'。 –

+0

請參閱:[堆棧溢出正則表達式常見問題](http://stackoverflow.com/a/22944075/3776858) – Cyrus

回答

1
sed -E 's/^(-?config\.test=).*/\1true/' file 

?意味着zero or 1 repetitions of所以這意味着-可以存在或不匹配正則表達式時。

0

我找到了一個特定長度的正則表達式的一些解決方案,而不是忽略第一角色與sed和awk。有時候,相反的方式會以更簡單的方式進行。

如果您只有使用sed的替代方法,則根據您的文件有兩種解決方法。

如果你的文件看起來像這樣

$ cat file 
config.test=false 
-config.test=false 
not.config.test=false 

您可以使用此一班輪

sed 's/^\(.\{11,12\}=\)\(.*$\)/\1true/' file 

的sed正在開頭的每一行的^並分組\(... \)供以後回來參照每字符.發生11次或12次\{11,12\}後跟=

該第一組將被替換爲後備參考\1

將刪除第之後的每個字符與行\(.*$\)的末尾相匹配的組。而不是第二組sed替換您想要的字符串true

這也意味着,新字符串true後面的每個字符都會被切碎。

如果你想避免這種情況,你的文件看起來像

$ cat file 
config.test=true  # Should match 
-config.test=true  # Should match 
not.config.test=false # Should NOT match 

您可以使用此一班輪

sed 's/^\(.\{11,12\}=\)\(false\)\(.*$\)/\1true\3/' file 

這就像之前的例子,但三組適用於回引用。

前組2的內容現在在組3中。因此,在從false改變爲true後沒有內容將被切斷。

新的第二組\(false\)將被丟棄並替換爲字符串true

如果你的文件看起來像在之前的例子,你被允許使用AWK,你可以試試這個

awk -F'=' 'length($1)<=12 {sub(/false/,"true")};{print}' 

對我來說,這看起來更不言自明,但到你的決定。

在這兩個sed示例中,您只會調用一次總是很好的sed命令。

第一個sed命令需要輸入39和第二個50個字符。 awk命令需要52個字符才能輸入。

請告訴我,這是否適用於您或您是否需要其他解決方案。

+0

這會將'butterflies = pretty'更改爲'butterflies = true'。始終考慮錯誤匹配。 –