我正在运行以下命令
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命令。任何帮助/建议表示赞赏。
答案 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-REGEX
和ANOTHER-COMPLEX-REGEX
- 我假设这些表达式具有方括号括起来的值。