我有一个文本文件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 命令,那会更好。
有什么建议吗?
答案 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
选项替换原位。