簡體   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