これは前の質問の高度なバージョンです(行を変更しようとしたときにパラメータを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
/
演算子の/home
2 番目に 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