繁体   English   中英

使用引号sed的正则表达式

[英]Regex with sed using quotation mark

我需要更改文件中的部分文本。 我尝试在bash中编写一个脚本来更新包含其他/旧JAVA_HOME的PATH。 我的正则表达式应该找到包含如下路径的文本部分,并使用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尝试了很多变体,但是在不停止第一个/ 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'结尾

你可以试试这个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#'

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM