gpt4 book ai didi

正则表达式与 sed 使用引号

转载 作者:太空狗 更新时间:2023-10-29 12:40:25 24 4
gpt4 key购买 nike

我需要更改文件中的部分文本。我尝试在 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 尝试了很多变体,但它不起作用或更改所有路径而不在第一个/bin 上停止。我认为问号有问题,但也许有人可以给我一个建议?或者帮助编写 sed 的正则表达式?

更新.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#'

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

关于正则表达式与 sed 使用引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com