bash替换用包含关键字的标记分隔的部分文本

时间:2014-05-24 16:10:13

标签: regex bash

如果其中有关键字

,我想替换:之间的所有内容

具有

  

TEXT =“/东西/样的:/如何/可酮替换/文本/分离/带/结肠/在于-包括/ A /的关键字 ?:有/可 - 是/多个/的关键字:/感谢:/的关键字

使用:

sed -e 's/regex here that searches for keyword/\/some\/path/g' <<< $TEXT

获得:

  

/东西/样的:/一些/路径:/一些/路径:/感谢:/一些/路径

P.S。
另一个让它更清晰的例子:如何将包含hello的路径替换为另一条路径?

/opt/hello/bin:/bin:/home/user/hello:/home/user/bin:/media/hello 
=>
/some/path:/bin:/some/path:/home/user/bin:/some/path 

我对不明确的问题道歉。

3 个答案:

答案 0 :(得分:3)

我认为你需要这个,

$ sed -r 's~^([^:]+):.*:([^:]+):(.*)$~\1:/Replacement:/Replacement:\2:/Replacement~g' file
/Something/like-this:/Replacement:/Replacement:/Thanks:/Replacement

或类似的东西,

$ sed -r 's~^([^:]+):.*:([^:]+):(.*)$~\1:/*Replacement*:/*Replacement*:\2:/*Replacement*~g' file
/Something/like-this:/*Replacement*:/*Replacement*:/Thanks:/*Replacement*

或者

它可能是这样的,如果你为Replacement变量指定一些路径,

$ Replacement=/foo/bar
$ sed -r "s~^([^:]+):.*:([^:]+):(.*)$~\1:/*$Replacement*:/*$Replacement*:\2:/*$Replacement*~g" file
/Something/like-this:/*/foo/bar*:/*/foo/bar*:/Thanks:/*/foo/bar*

或者

你也可以试试这个,

awk -v RS=: -v var=/path -v ORS=: '{sub (/.*hello.*/,var)}1' file

示例:

$ echo '/opt/hello/bin:/bin:/home/user/hello:/home/user/bin:/media/hello' | awk -v RS=: -v var=/foo/bar -v ORS=: '{sub (/.*hello.*/,var)}1'
/foo/bar:/bin:/foo/bar:/home/user/bin:/foo/bar:

<强>解释

  • Awk内置变量RS(记录分离器)和ORS(输出记录分离器)设置为:。因此,只要在输入中找到:并在:将在下一行之后处理文本,awk就会中断字符串。

  • ORS设置为:,因此awk以:作为分隔符打印记录。

  • -v var=/foo/bar,将替换字符串分配给变量var

  • sub (/.*hello.*/,var),如果记录与此正则表达式匹配,则会将整个记录替换为变量var中的值。

  • 1,打印所有记录。

答案 1 :(得分:1)

我的版本:

sed 's/:/::/g;s/^/:/;s/$/:/;s/:[^:]*keyword[^:]*:/:REPLACEMENT:/g;s/^://;s/:$//;s/::/:/g'

答案 2 :(得分:1)

使用bash

IFS=: read -ra arr <<<'/opt/hello/bin:/bin:/home/user/hello:/home/user/bin:/media/hello'
v=$(IFS=:; printf "%s\n" "${arr[*]/*hello*/\/some\/path}")
echo $v
/some/path:/bin:/some/path:/home/user/bin:/some/path