Linux +の規則に従ってファイルのSTRING / WORDを置き換える

Linux +の規則に従ってファイルのSTRING / WORDを置き換える

私の目標は、次の規則に従ってファイル内のすべての単語/文字列/文字を新しい単語/文字列に置き換えることです。

  1. 数字が単語/文字列の左側にある場合、その単語は置き換えられません。
  2. 数字が単語/文字列の右側にある場合、その単語は置き換えられません。

備考 - 数値とは、任意の数字または[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$$

おすすめ記事