regex - Perl CLI 就地字符串替换/用特殊字符替换多行
问题描述
我正在尝试编写一个 CLI 命令来更改配置文件的内容。
配置文件有以下几行:
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
我想将这两行更改为这一行:
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
我想替换多行,所以我尝试使用 Perl 来做到这一点。
perl -i -pe 's/JAVA_OPTS="\$JAVA_OPTS -XX:\+UseParNewGC"\nJAVA_OPTS="\$JAVA_OPTS -XX:\+UseConcMarkSweepGC"/JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"/' name-of-file.sh
但是,此命令不会更改文件。我猜正则表达式不匹配。我不知道为什么。我已经尝试了该命令的几种变体,并且尝试对匹配字符串中的$
and+
符号进行转义和双重转义,但我所做的没有任何区别。有人可以提供解决方案吗?
我在 macOS 上使用 Bash 3.2.57(1) 和 Perl 5.18.4。
解决方案
试试这个 perl 命令行,用-0777
and\R
代替\n
. -0777
在 perl 中启用 slurp 模式以匹配多行并\R
让它匹配所有类型的换行符(包括 DOS 或 OSX 或 Unix 换行符):
perl -0777 -i -pe 's/JAVA_OPTS="\$JAVA_OPTS -XX:\+UseParNewGC"\nJAVA_OPTS="\$JAVA_OPTS -XX:\+UseConcMarkSweepGC"/JAVA_OPTS="\$JAVA_OPTS -XX:+UseG1GC"/' file
推荐阅读
- arrays - 在循环中为数组赋值
- apache-kafka - Prometheus 中 JMX Exporter 的安全漏洞
- java - Java Stream 过滤器是否比条件 DB MySQL 查询更快?
- python - (新手)有没有办法根据变量跳过执行部分程序
- sql-server - 在 SQL Server 中使用 .modify 更新 XML 值
- angular - 当我使用它来隐藏表格列时,如何在多选 PrimeNG 中保持顺序?
- kubernetes - Replicaset-controller 为什么需要burstReplicas
- android - 使用 mpandroidchart 和 kotlin 显示条形图
- node.js - Heroku 上的代码已部署,但未安装
- sql-server - 修复“所有权限均已弃用和维护,仅出于兼容性考虑”