使用shell脚本替换文件中两个特定脚本之间的字符串

时间:2018-01-29 10:14:25

标签: bash awk sed sh

我有一个文本文件info.txt,其中包含:

/* prog_dir=/path/to/some/directory; */
dir_1=/some/other/path/to/a/directory/first;
dir_2=/some/other/path/to/a/directory/secord;

在这里,我想要替换这两对字符串之间存在的字符串,例如所有行dir_1=/some/other/path/to/a/directory/文件的;dir_2=/some/other/path/to/a/directory/以及;R03_0以及info.txt

对于每一行,它应该应用替换。

转换后,info.txt文件应该是:

/* prog_dir=/path/to/some/directory; */
dir_1=/some/other/path/to/a/directory/R03_0;
dir_2=/some/other/path/to/a/directory/R03_0;

试过这个:

sed '/^dir_1=/some\/other\/path\/to\/a\/directory\//,/^;/R03_0' /path/to/the/text/file/info.txt

如果我们可以将替换脚本R03_0作为变量$rel_ver传递给 sed / awk 命令,那会更好。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可以使用sed执行以下操作:

pattern='\/some\/other\/path\/to\/a\/directory'
str='R03_0'
sed "s/${pattern}\/.*;/${pattern}\/${str};/g" info.txt

<强> 输出:

/* prog_dir=/path/to/some/directory; */
dir_1=/some/other/path/to/a/directory/R03_0;
dir_2=/some/other/path/to/a/directory/R03_0;

这会将所有/some/other/path/to/a/directory/...;替换为您想要的模式,即/some/other/path/to/a/directory/R03_0;

答案 1 :(得分:1)

您可以使用群组捕获来实现此目的:

sed -re 's#^(/some/other/path/to/a/directory/).*;#\1R03_0;#g' info.txt

这将保存&#39;在大括号中匹配的模式,并将其放回\1

答案 2 :(得分:0)

由于所有行都以;结尾:

str='R03_3';
sed -e "s/\(^.*\/\).*;$/\1${str};/" info.txt
  • \(^.*\/\) - 捕获组匹配行首,任何字符和正斜杠
  • .+;$ - 行尾至少有一个字符后跟;

  • \1${str}; - 替换为捕获组和变量str中定义的文本

注意这不会更改文件,重定向输出或使用-i选项替换原位。