sed编辑带有变量和特殊字符的文本

时间:2012-03-09 19:17:52

标签: macos bash sed

我在OS X上编写一个bash脚本来编辑文件中的文本,该文件包含一些带有特殊字符的已知文本。还有一个变量需要保留,一些文本输入或替换。 这是输入文件内容:

user_pref("intl.charsetmenu.browser.cache", "UTF-8");  
user_pref("network.automatic-ntlm-auth.trusted-uris", "search.co.za");  
user_pref("network.cookie.prefsMigrated", true);  

我目前有这段代码:

existingTrusts=`more ~/prefs.js | grep "network.automatic-ntlm-auth.trusted-uris" | awk '{print $2}' | sed 's/);//g' | sed 's/"//g'`
trustSites="company.com,organisation.co.uk,$existingTrusts"
replacementValue='"user_pref("network.automatic-ntlm-auth.trusted-uris", "$trustSites");"'
sed -i 's/^user_pref("network.automatic-ntlm-auth.trusted-uris/$replacementValue/' ~/prefs.js > ~/newPrefs.js

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

为什么这么复杂?

trustedSites='company.com,organisation.co.uk,'
sed -i '' -e '/network.automatic-ntlm-auth.trusted-uris/s/, "\([^"]*\)/, "'"${trustedSites}"'\1/' prefs.js

这是不完美的,因为

  • 它在假定文字.的模式中使用未转义的.
  • 它假定, "将完全按预期的那样出现

这些事情可以解决。

答案 1 :(得分:1)

您使用太多管道来设置现有的Trusts变量。像这样设置变量:

existingTrusts=$(awk '/network.automatic-ntlm-auth.trusted-uris/ {gsub(/"|\);/, "", $2); print $2}' ~/prefs.js)
trustSites="company.com,organisation.co.uk,$existingTrusts"
replacementValue='user_pref("network.automatic-ntlm-auth.trusted-uris", "'$trustSites'");'

# and now finally your sed command
sed 's/^user_pref("network.automatic-ntlm-auth.trusted-uris".*$/'"$replacementValue"'/' ~/prefs.js > ~/newPrefs.js