【问题标题】:Regex with sed using quotation mark使用引号的 sed 正则表达式
【发布时间】:2018-04-03 05:09:26
【问题描述】:

我需要更改文件中的部分文本。我尝试在 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 和正则表达式尝试了很多变体,但是如果不停止第一个 /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'结尾

【问题讨论】:

标签: regex linux bash sed


【解决方案1】:

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

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

【讨论】:

  • 谢谢!但它只适用于特定情况,不适用于我的所有规则。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2011-10-02
  • 2014-04-10
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多