我有这个正则表达式:
Try[Option[Int]]
我想替换此文本:
(;)(include_path\s\=\s\")(((?!\").)*)(\")
至:
;include_path = ".:/usr/share/php"
正则表达式替换为:
include_path = ".:/usr/share/php:/var/www/html/"
我在ubuntu 18.04中使用sed,这是我的命令:
\2\3:/var/www/html/\5
但这给我一个错误。我使用了sed这样的样式:
sed -E 's/(;)(include_path \= \")(((?!\").)*)(\")/\2\3:/var/www/html/\5/g' FILENAME
答案 0 :(得分:3)
您不能以sed
模式使用前瞻。但是,您的脾气暴躁的令牌(?:(?!\").)*
可以简单地转换为sed
支持的否定的括号表达式[^"]*
。
此外,由于/
用于替换模式,因此您还需要其他正则表达式定界符,例如|
。
使用
sed -E 's|;(include_path = ")([^"]*)(")|\1\2:/var/www/html/\3|g' FILENAME
请参见online demo:
s=';include_path = ".:/usr/share/php"'
echo $s | sed -E 's|;(include_path = ")([^"]*)(")|\1\2:/var/www/html/\3|g'
# => include_path = ".:/usr/share/php:/var/www/html/"
详细信息
;
-分号(如果需要丢弃则无需捕获)(include_path = ")
-捕获到第1组(\1
)中的文字文本([^"]*)
-捕获到第2组("
)中的\2
以外的任何0+个字符(")
-捕获到第3组("
)中的\3
。答案 1 :(得分:2)
根据您到目前为止告诉我们的信息,听起来这就是您所需要的:
$ sed 's#;\(include_path = "[^"]*\)#\1:/var/www/html/#' file
include_path = ".:/usr/share/php:/var/www/html/"
以上内容可在任何UNIX盒中的任何外壳中使用任何sed来工作。