【发布时间】:2023-03-13 19:58:02
【问题描述】:
我有特殊的文件格式,我需要替换几十个字符串并重新格式化其结构。作为最简单的解决方案,我准备了我的模式文件,其中存储了所有正则表达式定义/替换(约 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。
我尝试使用lookbehind,但没有成功。请注意,我只需要一个可以在我的模式文件中使用的正则表达式定义(即没有 perl 代码)。或者,我可以使用sed 或awk 来处理这种情况,但我不太熟悉。
感谢社区!
正则表达式101:https://regex101.com/r/Ic4ciA/1
【问题讨论】:
-
您是否仅限于
sed和awk,或者是否有可以在这里使用的编程语言? -
这个替换过程只是我的
bash脚本中的操作之一,所以我可以对管道执行任何简单的命令。我想我可以使用一些代码来处理这个问题(我对python非常熟悉)。但我更好奇是否可以用一些特殊的正则表达式模式匹配和替换字符串。
标签: regex regexp-replace