grep + sed替换字符串周围的字符

时间:2010-12-08 14:18:48

标签: string sed grep

我希望通过一个文件夹进行递归,并用{{text in here}}

替换%{text in here}的所有出现

我检查了其他grep + sed主题,但它们通常与标准字符串替换有关;我想保持字符串不变,但是替换一些字符围绕字符串(基本上用%替换第一个左括号并删除第二个右括号。)

4 个答案:

答案 0 :(得分:1)

除非由于某种原因必须使用sed,否则Perl几乎总是更受欢迎,因为它更清晰,功能更强大的正则表达式语法:

find ... | xargs perl -i~ -pe 's/{{(.*?)}}/%{$1}/g'

此外,尽管-i~创建了备份,但我强烈建议您在玩这个之前备份整个树。我无法通过两次运行破坏的命令行来计算我擦除工作的次数。最常见的错误是意外使用-ne而不是-pe,这导致所有数据都从原件中删除。再次运行它会用新清空的文件替换备份,只留下你肚子里的下沉感。

答案 1 :(得分:1)

尝试像s/{{\(.*\)}}/%{\1}/

这样的正则表达式 第二个字符串中的

\ 1被第一个(...)对的内容替换

答案 2 :(得分:0)

这会有用吗?

sed 's/{{/%{/g;s/}}/}/g' inputfile

sed 's/{{\([^}]*\)}}/%{\1}/g' inputfile

答案 3 :(得分:0)

使用临时字符允许排除([^³])。这假设里面没有³²。几乎任何其他字符都可以通过首次检查/替换来使用或保护,但通常不需要标准内容。

sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g' YourFile

在KSH / posix sed上

echo "{{abc}} def {{ghi}} jkl {{ mno } {{pqr}}" | sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g'

%{abc} def %{ghi} jkl %{ mno } {{pqr}

请注意{{ mno } {{pqr}}

上的最后一次封装行为