我有一种特殊的文件格式,需要替换几十个字符串并重新格式化其结构。作为最简单的解决方案,我准备了我的patterns文件,其中存储了所有正则表达式定义/替换(〜100个替换)。我正在使用perl查找和替换模式(perl -p patterns source.file
)。到目前为止一切都很好。
但是,有一种情况我无法使用正则表达式解决。我需要在整个行的一部分中替换字符串,即仅在子字符串中替换字符串。
示例:为简单起见,我只需要在中间字符串(用;分隔)中将所有“ A”替换为“ X”。
输入行:
ABCD ABCD; ABCD ABCD; ABCD ABCD
预期输出:
ABCD ABCD; XBCD XBCD; ABCD ABCD
^ ^
the only replaced characters
这将正确替换所有字符:
s/A/X/g;
但是我只需要在中间字段中替换逗号。我尝试过:
s/(.*?;.*?)A/\1X/g;
s/(.*?;.*)A(.*?;)/\1X\2/g; # alternative to find the last A
但是这将替换第一个A。我可以有多个类似的模式来重复搜索和替换过程,但这听起来不是一个好的解决方案,因为我不知道子字符串中将有多少个A。
我尝试过向后看,但未成功。请注意,我只需要可以在我的模式文件中使用的正则表达式定义(即没有perl代码)。另外,我可以使用sed
或awk
来处理这种情况,但我对此不太熟悉。
谢谢,社区!
Regex101:https://regex101.com/r/Ic4ciA/1