Linux

Linux + 根據規則替換文件中的 STRING/WORD

  • December 11, 2012

我的目標是根據以下規則用新單詞/字元串替換文件中的任何單詞/字元串/任何字元:

  1. 如果單詞/字元串左側的數字字元那麼我們不替換單詞
  2. 如果單詞/字元串右側的數字字元那麼我們不替換單詞

備註 - 數字表示任何數字或

$$ a-z $$或者$$ A-Z $$ 以下範例描述了 file before 和 file after:

我想替換單詞“

$$ OLD_WORD $$" 與 “&&NEW_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 中的結果?

.

您需要使用負面的後視/前瞻:

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$$

引用自:https://unix.stackexchange.com/questions/58158