正则表达式sed linux批处理

时间:2018-07-23 22:30:59

标签: regex bash sed

我有这个正则表达式:

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

2 个答案:

答案 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来工作。