【发布时间】:2018-04-03 05:09:26
【问题描述】:
我需要更改文件中的部分文本。我尝试在 bash 中编写一个脚本来更新我的 PATH,其中包含其他/旧的 JAVA_HOME。我的正则表达式应该找到包含如下路径的部分文本并使用 sed 命令更改它。
/**/jdk/jdk.*/bin
我做了正则表达式:
-
([/])[^/]([/]jdk[/]jdk).?([/]bin)
-
(/)[^/](/jdk/jdk).?(/bin)
.bash_env
JAVA_HOME="/opt/jdk/jdk1.8.0_151"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/jdk/jdk1.8.0_151/bin:example/not/for/change/bin"
预期输出
JAVA_HOME="/opt/jdk/jdk1.8.0_151"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:CHANGED:example/not/for/change/bin"
sed 命令
sed -r 's#([/])[^\/]*([/]jdk[/]jdk).*?([/]bin)#CHANGED#g' ~/.bash_env
问题
我用我的 sed 和正则表达式尝试了很多变体,但是如果不停止第一个 /bin,它就不起作用或更改所有路径。我认为这是问号的问题,但也许有人可以给我一个建议?或者帮助为 sed 编写正则表达式?
UPDATE.1 我的解决方案不起作用时的示例
示例 .bash_env
PATH="/usr/local/sbin:/opt/jdk/jdk1.8.0_151/bin:/example/not/jdk/for/change/bin"
我的 sed
sed -r 's#([/])[^\/]*([/]jdk[/]jdk).*?([/]bin)#CHANGED#g' ~/.bash_env
给定结果
PATH="/usr/local/sbin:CHANGED"
预期结果
PATH="/usr/local/sbin:CHANGED:/example/not/jdk/for/change/bin"
正则表达式(使用 sed)应该改变以下单词:
- 以'/'开头
- 不包含':'
- 包含“jdk/jdk”
- 以'/bin'结尾
【问题讨论】:
-
你能提供一个它不起作用的样本吗?