![Linux + 根据规则替换文件中的STRING/WORD](https://linux22.com/image/43650/Linux%20%2B%20%E6%A0%B9%E6%8D%AE%E8%A7%84%E5%88%99%E6%9B%BF%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84STRING%2FWORD.png)
我的目标是根据以下规则用新单词/字符串替换文件中的任何单词/字符串/任何字符:
- 如果数字字符位于单词/字符串的左侧,那么我们不会替换该单词
- 如果数字字符位于单词/字符串的右侧,那么我们不会替换该单词
备注 - 数字表示任何数字或 [az] 或 [AZ]
以下示例描述了之前的文件和之后的文件:
我想用“&&NEW_WORD&&”替换单词“$$OLD_WORD$$”
示例 1 - 替换前的文件
more file
ABC$$OLD_WORD$$ABC
$$OLD_WORD$$GG
$$OLD_WORD$$
1$$OLD_WORD$$
示例 2 - 替换后的文件
more file
ABC$$OLD_WORD$$ABC
$$OLD_WORD$$
&&NEW_WORD&&
1$$OLD_WORD$$
因此,为了替换我提到的有关规则 (1,2) 的单词,我编写了以下语法(此 Perl 命令存在于我的 ksh 脚本中)
perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file
但是这个 perl 命令并没有像示例 2 那样进行替换!
以下示例描述了我从 Solaris/linux 机器获得的结果:
export OLD_TEXT='$$OLD_WORD$$'
export NEW_TEXT='&&NEW_WORD&&'
perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&ABC$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&WORD$&&NC
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&1$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&
请告知我需要在 Perl 语法中修复哪些内容才能获得示例 2 所示的结果?
。
答案1
您需要使用负向后看/向前看:
export OLD_TEXT='$$OLD_WORD$$'
export NEW_TEXT='&&NEW_WORD&&'
perl -pe 's/(?<![[:alnum:]])\Q$ENV{OLD_TEXT}\E(?![[:alnum:]])/$ENV{NEW_TEXT}/g' file
给出
ABC$$OLD_WORD$$ABC
&&NEW_WORD&&
&&NEW_WORD&&
1$$OLD_WORD$$