Perl置換演算子で変数補間を無効にするにはどうすればよいですか。
質問
VMのテキストファイル内の特定の行を交換しようとしています。通常、これはPerlを持つ単純なワンライナーです。しかし、交換側がVMSパスを含むシンボルであったときに問題になりました。これがファイルで、私が試したものです:
File1.txtの内容:
foo
bar
baz
quux
.
3行目に置き換えようとしました:
$ mysub = "disk$data1:[path.to]file.txt"
$ perl -pe "s/baz/''mysub'/" file1.txt
.
次の出力を得ます:
foo
bar
disk:[path.to]file.txt
quux
.
Perlが過剰なように見え、パスの$data1
部分を存在しない変数の内容(すなわち、何もない)に置き換えられました。デバッガを使って実行してそれを確認しました。私は/e
を提供しませんでしたので、PerlがテキストをAS-ISに置き換えるだけです。それをするためにPerlを得る方法はありますか?
(Linuxコマンドラインで同様の動作を再現できます。)
解決
引用符と二重引用符をちょうどそこに入ることができる:
「文字列」+ '代替シンボル' + "String"の厳密な連結を作成します。 2つの二重引用符付き文字列には、代替品の一重引用符が含まれています。 対戦しました...しかしそれはうまくいきます。
$ perl -pe "s'baz'"'mysub'"'" file1.txt
.
それはDCLレベルの解です。
Perlソリューションの場合は、q()
演算子を使用しないでください。
シンプルなDCLの置き換えを使用して、シンボルをPRANに詰め込みます。
これは私のお気に入りです(ほとんど)私にとって理にかなっていて、引用符で混乱しないではありません。
$ perl -pe "s/baz/q(''mysub')/e" file1.txt
. 他のヒント
は数十年にVMSシステムを見たことさえしていませんが、...あなたのシギルを脱出しますか?
$ mysub = "disk\$data1:[path.to]file.txt"
.
または多分
$ mysub = "disk\\$data1:[path.to]file.txt"
.
?
sh
または派生物の場合は、を使います
perl -pe'BEGIN { $r = shift(@ARGV) } s/baz/$r/' "$mysub" file1.txt
.
それ以外の場合は、Perl文字列リテラルへのmysub
の値をどういうわけか隠す必要があります。それはより複雑になるでしょう。あなたのシェルの同等のものを見つけます。
op:
はい、これは機能します。VMがです
.perl -pe "BEGIN { $r = shift(@ARGV) } s/baz/$r/" 'mysub' file1.txt
$
を使用して\$
をエスケープする必要があります。それ以外の場合、Perlは変数参照を見て、正規表現が評価される前にString $data1
を$data1
の内容に置き換えます。$data1
を定義しなかったので、もちろん空です。
次のコードを使用できます。
$ mysub='disk\$data1:[path.to]file.txt'
$ perl -pe 's/baz/'$mysub'/' FILE
foo
bar
disk$data1:[path.to]file.txt
quux
. DCLシンボルの代わりに論理名を使用してみてください。
$ define mysub "disk$data1:[path.to]file.txt"
$ $ perl -pe "s/baz/mysub/" file1.txt
. 使用しています。
SEDは$data1
を変数として補間しようとしないので、必要なものを手に入れるべきです。
.$ sed -e "s/baz/''mysub'/" file1.txt