我需要更改文件中的部分文字。我尝试在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和regex尝试了很多变化,但是它没有工作或改变所有路径而没有停在first / bin上。我认为这是问题标记的问题,但也许有人可以给我一个建议?或者帮助为sed写正则表达式?
UPDATE.1 我的解决方案无效的示例
示例.bash_env
PATH="/usr/local/sbin:/opt/jdk/jdk1.8.0_151/bin:/example/not/jdk/for/change/bin"
my 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'结尾
答案 0 :(得分:0)
你可以试试这个sed
echo $PATH | sed 's/\([^:]*\)/CHANGED/8'
我认为搜索路径并不总是在同一个地方,所以试试这个。
echo $PATH | sed 's#\(.*\)\(:/.*jdk[^:]*\)\(:.*\)#\1:CHANGED\3#'
你可以测试一下:
echo $path | sed 's#\(.*\)\(:*\)\(/.*/jdk/jdk[0-9._]*/bin\)\(:*\)\(.*\)#\1\2CHANGED\4\5#'
我尝试使用开始位置,结束位置和中间位置。