私の目標は、次の規則に従ってファイル内のすべての単語/文字列/文字を新しい単語/文字列に置き換えることです。
- 数字が単語/文字列の左側にある場合、その単語は置き換えられません。
- 数字が単語/文字列の右側にある場合、その単語は置き換えられません。
備考 - 数値とは、任意の数字または[az]または[AZ]を意味します。
次の例では、前のファイルと後のファイルについて説明します。
「$$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&
例 2 に示す結果を得るには、Perl 構文で修正する必要があることを教えてください。
。
答え1
否定的な Lookbehind/lookforward を使用する必要があります。
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$$