bashでPerlを呼び出してファイルパスを渡すには?

bashでPerlを呼び出してファイルパスを渡すには?

これは前の質問の高度なバージョンです(行を変更しようとしたときにパラメータをPerlに渡すにはどうすればよいですか?)そうでした。

今回はパスを渡そうとしましたが、Perlスクリプトが/を誤って読んだようです。

file.txtの4行目が次のようになるとします。

 path_root_abs = "/path/to/thefile"

作業ディレクトリをインポートして/path/to/fileに置き換えるには

 directory=`pwd`
 perl -i -pe "s/(path_root_abs\s=\s\")(.*)(\")/\$1${directory}$3/ if \$. == 4" file.txt

そして得る:

Bareword found where operator expected at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
syntax error at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
Execution of -e aborted due to compilation errors.

Unixがスクラッチ後の\を裸の単語として読むのを防ぐにはどうすればよいですか?

ベストアンサー1

最初の問題は、$directory代替演算子()s///の区切り文字としても使用されるスラッシュが含まれることです。デフォルトでは、Perlが見るものは次のとおり$directoryです。/home/je_b

 perl -i -pe "s/foo//home/jb/ if \$. == 4" file.txt

/演算子の/home2 番目に of を使用します。最も簡単な解決策は、代わりに別の文字を使用することです。/s////

perl -i -pe "s#foo#${directory}#" file.txt

ただし、他の方法で単純化できます。考えてみてください:

perl -pe "s#(path_root_abs = \")(.*)#\1${directory}\"# if \$. == 4" file
  • \sスペースのみを一致させる必要がある場合は必要ありません。スペースのみを使用してください。
  • Perlの代替演算子は両方を理解しているので、$1後者\1を使用してエスケープを避けてください。
  • キャラクターをキャッチしても役に立ちません"。そこにいることがわかっている場合は、自分で追加してください。

pwd最後に、Perlから直接インポートすることもできます。 Perlは、ハッシュを介してエクスポートされたすべてのシェル変数にアクセスできます%ENV。したがって、次のようにすることができます。

perl -pe 's#(path_root_abs = ").*#$1$ENV{PWD}"# if $.==1' file

おすすめ記事