【发布时间】:2014-05-09 16:49:13
【问题描述】:
我希望通过文件夹递归并将所有出现的{{text in here}} 替换为%{text in here}
我检查了其他 grep+sed 主题,但它们通常与标准字符串替换有关;我想保持字符串完整,但替换字符串周围的一些字符(基本上用%替换第一个左大括号并删除第二个右大括号)。
【问题讨论】:
我希望通过文件夹递归并将所有出现的{{text in here}} 替换为%{text in here}
我检查了其他 grep+sed 主题,但它们通常与标准字符串替换有关;我想保持字符串完整,但替换字符串周围的一些字符(基本上用%替换第一个左大括号并删除第二个右大括号)。
【问题讨论】:
除非您出于某种原因必须使用sed,否则 Perl 几乎总是更可取的,因为它的正则表达式语法更简洁、更强大:
find ... | xargs perl -i~ -pe 's/{{(.*?)}}/%{$1}/g'
此外,尽管-i~ 创建了备份,但我强烈建议您在尝试此操作之前备份整个树。我无法计算通过两次运行损坏的命令行来擦除工作的次数。最常见的错误是不小心使用-ne 而不是-pe,这会导致所有数据都从原件中删除。再次运行它会将备份替换为新清空的文件,让您只剩下一种在胃里下沉的感觉。
【讨论】:
试试像s/{{\(.*\)}}/%{\1}/这样的正则表达式
\1 被第一个 (...) 对的内容替换
【讨论】:
{{abc}} def {{ghi}} 替换为%{abc}} def {{ghi}。
这行得通吗?
sed 's/{{/%{/g;s/}}/}/g' inputfile
或
sed 's/{{\([^}]*\)}}/%{\1}/g' inputfile
【讨论】:
{{ 和 }} 之间没有 },所以如果 Alex 假设这是一个非常简单和好的解决方案
使用临时字符允许排除 ([^³])。这假设里面没有³ 和²。几乎任何其他字符都可以通过第一次检查/替换来使用或保护它,但标准内容通常不需要。
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}} 上的最后一个封装行为
【讨论】: