Linux + 根据规则替换文件中的STRING/WORD

Linux + 根据规则替换文件中的STRING/WORD

我的目标是根据以下规则用新单词/字符串替换文件中的任何单词/字符串/任何字符:

  1. 如果数字字符位于单词/字符串的左侧,那么我们不会替换该单词
  2. 如果数字字符位于单词/字符串的右侧,那么我们不会替换该单词

备注 - 数字表示任何数字或 [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$$

相关内容