正则表达式与sed使用引号

时间:2017-10-22 15:48:05

标签: regex linux bash sed

我需要更改文件中的部分文字。我尝试在bash中编写一个脚本来更新我的PATH,其中包含其他/旧的JAVA_HOME。我的正则表达式应该找到包含如下路径的文本的一部分,并使用sed命令进行更改。

  

/ ** / 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'结尾

1 个答案:

答案 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#'

我尝试使用开始位置,结束位置和中间位置。