如何用Linux文件中包含另一行(新目录路径)的变量替换行(目录路径)?

时间:2015-11-11 23:50:21

标签: linux bash awk sed

我有一个包含以下内容的文件:

aaaaaaaaaa
export ORACLE_HOME=/home/oracle/test/prod/db_1
bbbbbbbbbb

现在我想替换

export ORACLE_HOME=/home/oracle/test/prod/db_1

如下所示:

export ORACLE_HOME=/u01/app/oracle/product/11204/dbhome_1

我尝试了很多通过Google找到的方法,例如使用" sed"或者" awk"但没有人工作。我试过了:

export D1="export ORACLE_HOME=/u01/app/oracle/product/11204/dbhome_1"
sed -i -e "s+export ORACLE_HOME=/home/oracle/test/prod/db_1+$D1+" file.lst

注意:正如一个谷歌搜索所说,因为字符串包含" /",所以不同的分隔符如" +"需要使用。

你能和我分享正确的命令吗?

2 个答案:

答案 0 :(得分:1)

sed -r 's~(ORACLE_HOME=).*~\1new/path/here~'

此处~用作分隔符。如果新路径是bash变量,则可以转义引号

sed -r 's~(ORACLE_HOME=).*~\1'$D1'~'

答案 1 :(得分:0)

如果您仍然遇到替换问题,可以使用此变体,在尝试路径替换之前将明确地找到包含export ORACLE_HOME的行。该表达式使用替换分隔符替换'|'

要进行就地编辑(Linux),您可以使用'-i'选项(并添加'-i.bak'来备份原始版本)。如果您在没有'-i'选项的情况下使用mac或其他操作系统,请使用重定向创建一个可以在当前文件上复制的新文件。

sed -i '/^export\sORACLE_HOME/s|=.*$|=/u01/app/oracle/product/11204/dbhome_1|' \
yourfilename

或没有'-i'

sed '/^export\sORACLE_HOME/s|=.*$|=/u01/app/oracle/product/11204/dbhome_1|' \
yourfilename > newfilename
cp yourfilename yourfilename.sav && mv -f newfilename yourfilename 

注意: '\'命令行末尾的sed是一个简单的行继续)

使用替换变量

根据您的评论,如果您想为替换字符串使用变量而不是硬编码路径,那么只需用双引号替换单引号并将变量包含为替换字符串。例如:

npath=/u01/app/oracle/product/11204/dbhome_1
sed -i "/^export\sORACLE_HOME/s|=.*$|=$npath|" dat/opath.txt