正则表达式多行模式和替换替换

正则表达式多行模式和替换替换

对于迁移过程,我需要在 bash 脚本中进行一些替换。

因此,在我的 .txt 文件中,我有以下引用:

{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}

我需要做的是使用以下格式编辑所有这些事件:

=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  1. {{ }} 已删除。
  2. === === 添加在第一行。

我尝试做的是构建 sed 正则表达式来进行替换

sed -i -e 's/{{Info DOC/=== Info DOC ===/g' test_file.txt

因此,它按预期工作,但 a 不能对字符串“}}”执行相同操作,因为它将按预期匹配更多内容。

我正在尝试用这样的方法来实现它:

find . -name '*.txt' -exec perl -i -pe 's/{{Info DOC\(.*\)}}/=== Info DOC ===\n\1/g' {} \;

如果你能给我一些线索,那就太好了!谢谢你们 !

最终解决方案:(谢谢@Sundeep)

find . -name '*.txt' -exec perl -i -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' {} \;

PS:我在MacOS系统上使用bash v4

答案1

试试这些:

$ # tested on GNU-sed, not sure of syntax for other versions
$ sed '/{{Info DOC/,/}}/ { s/{{\(Info DOC\)/=== \1 ===/; /}}/d }' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • /{{Info DOC/,/}}/从包含行{{Info DOC到包含行}}(参见范围地址详情)
    • s/{{\(Info DOC\)/=== \1 ===/根据需要进行变换
    • /}}/d删除这个
    • 其余行不会改变


perl

$ perl -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • -0777slurp 整个文件,因此此解决方案不适合太大的输入文件
  • .*?非贪婪匹配
  • s修饰符也允许.匹配换行符

相关内容