文件中有两个相同的字符串,但需要替换第二个字符串中的单词

Two same string in file but need replace the word in second string

我的文件中包含以下字符串。

ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '/home/oracle/oradata/undotbs01.dbf';

使用 bash 方法,我想将第二个“undotbs01.dbf”替换为另一个名称。当我用 grep 和 sed 完成它时,它会将文件中的所有 undotbs01 单词更改为新值。但我只需要更改第二个 undotbs(位于“TO”字之后)。

sedback-references我的建议是:

$ cat in
ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '/home/oracle/oradata/undotbs01.dbf';
$ sed -e "s,\(.*/\).*\(dbf.*\),newname.," < in
ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '/home/oracle/oradata/newname.dbf';

这使用了第一个 .* 模式的贪心(即它希望尽可能多地匹配)。

建议 awk 脚本:

awk 脚本:

awk '{sub(".*",str,$(NF-1));print}' FS="'" OFS="'" str="123"

结果:

awk '{sub(".*",str,$(NF-1));print}' FS="'" OFS="'" str="123" <<< $(echo "ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '/home/oracle/oradata/undotbs01.dbf';")
ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '123';

说明:

将替换字符串放入 str="value" 或变量名 $var str="$var"

说明

FS="'" awk 字段分隔符设置为 '

OFS="'" awk 输出字段分隔符设置为 '

sub(".*",str,$(NF-1)) substitute/replace 值(最后一个字段 - 1)和 str 值。最后一个字段$FN是终止符;

使用sed

sed 's/undotbs01\.dbf/new_value/2' input_file
ALTER DATABASE RENAME FILE '/home/oracle/oradata/undotbs01.dbf' TO '/home/oracle/oradata/new_value';