Sed:将替换应用于捕获的组

时间:2014-12-27 01:16:24

标签: awk sed

我正在运行以下命令

find ./ -type f -exec sed -i -r "s/name='(REGEX)' value='REGEX'/name='\1' value='\1'/g" {} \;

捕获的组\ 1输出如下内容:

MainCategory[ChildCategory][GrandchildCategory][GeatGrandchildCategory]

我尝试做的是替换(使用相同的sed命令)所有方括号仅包含句点值,预期输出将是:

name='MainCategory[ChildCategory][GrandchildCategory][GeatGrandchildCategory]' value='MainCategory.ChildCategory.GrandchildCategory.GeatGrandchildCategory'

注意:MainCategory深度未知。

我试图避免运行另一个sed命令。任何帮助/建议表示赞赏。

4 个答案:

答案 0 :(得分:1)

根据评论,如果输入是(文件data.in):

name='main[sub][subsub][least]' value='abs.nom.value'
name='MainCategory[ChildCategory][GrandchildCategory][GeatGrandchildCategory]' value='Diddly:Squat'

然后所需的输出是(文件data.out):

name='main[sub][subsub][least]' value='main.sub.subsub.least'
name='MainCategory[ChildCategory][GrandchildCategory][GeatGrandchildCategory]' value='MainCategory.ChildCategory.GrandchildCategory.GeatGrandchildCategory'

我会在文件中创建一个脚本 - 我称之为sed.1 - 就像这样:

/name='\([^[]*\)\[\([^[]*\)]\[\([^[]*\)]\[\([^[]*\)]' value='[^']*'/{
    s//name='\1[\2][\3][\4]' value='\1.\2.\3.\4'/
}

我仍然可以使用原始的sed正则表达式语言,在这个例子中,它工作得很好,虽然有点冗长。 然后我可以用:

运行它
sed -f sed.1 data.in

输出与data.out相同。这假设您可以修改复杂的正则表达式以捕获单独捕获中的四个段。

如果无法修改复杂正则表达式以分别识别这四个部分,那么您仍然可以获得所需的结果。例如(文件sed.2):

/^name='\([^']*\)' value='[^']*'/{
    s//\1/
    h
    s/]\[/./g
    s/\[/./
    s/]//
    s/.*/value='&'/
    x
    G
    s/\(.*\)\n/name='\1' /
}

这也会从样本输入中产生所需的输出。

答案 1 :(得分:0)

sed在同一个调用中接受多个表达式,只需使用-e选项链接它们:

sed -i -r -e "s/name='(COMPLEX-REGEX)' value='ANOTHER-COMPLEX-REGEX'/name='\1'/g" -e "s/[][]/\./g"

答案 2 :(得分:0)

使用如下的基本sed。

sed 's/^\([^ ]*\) \(.*\)$/\2/;s/^\[\|\]$//g;s/\(\[\|\]\)\+/./g'

示例:

$ echo 'foo MainCategory[ChildCategory][GrandchildCategory][GeatGrandchildCategory]' | sed 's/^\([^ ]*\) \(.*\)$/\2/;s/^\[\|\]$//g;s/\(\[\|\]\)\+/./g'
MainCategory.ChildCategory.GrandchildCategory.GeatGrandchildCategory

答案 3 :(得分:0)

find ./ -type f -exec sed -r -i.bak -e '/value='ANOTHER-COMPLEX-REGEX'/s/(\]\[|\]|\[)/./g' -e '/name='COMPLEX-REGEX'/s/(\]\[|\]|\[)/./g' {} \;

-i.bak使用扩展名.bak

备份原始文件

COMPLEX-REGEXANOTHER-COMPLEX-REGEX - 我假设这些表达式具有方括号括起来的值。