Linux
Linux + 根據規則替換文件中的 STRING/WORD
我的目標是根據以下規則用新單詞/字元串替換文件中的任何單詞/字元串/任何字元:
- 如果單詞/字元串左側的數字字元那麼我們不替換單詞
- 如果單詞/字元串右側的數字字元那麼我們不替換單詞
備註 - 數字表示任何數字或
$$ 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$$