对于迁移过程,我需要在 bash 脚本中进行一些替换。
因此,在我的 .txt 文件中,我有以下引用:
{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}
我需要做的是使用以下格式编辑所有这些事件:
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
- {{ }} 已删除。
- === === 添加在第一行。
我尝试做的是构建 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
-0777
slurp 整个文件,因此此解决方案不适合太大的输入文件.*?
非贪婪匹配s
修饰符也允许.
匹配换行符