2011-12-21 32 views
0

我的情况是,以取代以下字符串解决方案中的所有脚本替换字符串

/dboracle/orabase/product/10.2.0 

/dboracle/orabase/product/11.2.0.2_org 

ksh包含下列值,

export ORACLE_HOME="/dboracle/orabase/product/10.2.0" 
export ORACLE_HOME="/dboracle/orabase/product/10.2.0_RDBMS" 
export JAVA_HOME=/dboracle/orabase/product/10.2.0/jdk/bin 

我应该改变单独第一行我不应该打扰第二和第三行

使用find,我将得到脚本列表并使用sed/awk单行命令对其进行更改。

find/-type f -name "*.ksh" -exec grep -H "/dboracle/orabase/product/10.2.0" '{}' \; -print 2>/dev/null 

让我知道解决方案。

回答

0

我为我的移动装置上,所以没有测试它的任何方式,但这应该工作 -

sed -i"bak" '/ORACLE_HOME/s/10\.2\.0"/11.2.0.2_org"/' file

更新:

好了,因为我已经说,上面的单线应该起作用。您可以与您find声明如下使用它:

find /path/to/scripts -type f -name "*.ksh" -exec sed -i"bak" '/ORACLE_HOME/s/10\.2\.0"/11.2.0.2_org"/' {} \; 

注:-i"bak"如果要备份在更改前脚本时,才需要。这将为您的所有脚本创建两组文件,其中原始文件将被修改并在其末尾以相同名称备份bak。如果你不想备份,那么-i应该没问题。

+0

如何找到并替换find/-type f -print0 | xargs -0 sed -i /ORACLE_HOME/s/10\.2\.0"/11.2.0.2_org"/g' – AruM 2011-12-21 07:07:23

+0

我不喜欢'xargs'。但这只是我的偏好。只要你的替代作品是重要的。 :)另外,我注意到了'sed'语句中的'g'。这是'全球'。如果您认为在同一行上有多个表达式需要替换,那么您需要这样做。如果你只有一个/行,那么你不需要'g'。 – 2011-12-21 07:10:49

+0

如果我想改变第二行。它将如何? – AruM 2011-12-21 07:10:56