首页 > 解决方案 > 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。

标签: regexperlreplace

解决方案


试试这个 perl 命令行,用-0777and\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

推荐阅读