5

VMSのテキストファイルの特定の行を置き換えようとしています。通常、これは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はテキストをそのまま置き換える必要があると思いました。Perlにそれをさせる方法はありますか?

(Linuxコマンドラインでも同様の動作を再現できることに注意してください。)

4

8 に答える 8

4

私のコメントを読んだときにruakhが発見したように、perl補間の問題は%ENV、シェル変数を使用するのではなく、ハッシュにアクセスすることで解決できます。

perl -pwe "s/baz/$ENV{mysub}/" file1.txt

ワンライナーでも-w使わないと信じていないので付け加えました。warnings

于 2012-10-01T18:40:24.980 に答える
4

引用符と二重引用符を適切に組み合わせると、次のようになります。

「文字列」+「置換記号」+「文字列」の緊密な連結を作成します。2つの二重引用符で囲まれた文字列には、代替の単一引用符が含まれています。考案されました...しかし、それは機能します。

$ perl -pe "s'baz'"'mysub'"'" file1.txt

これはDCLレベルのソリューションです。

Perlソリューションの場合、q()補間されていない文字列の演算子を使用して実行します。単純なDCL置換を使用して、シンボルをパレンに詰め込みます。これは(ほとんど)私にとって理にかなっており、引用符と混同しすぎないため、私のお気に入りです。

$ perl -pe "s/baz/q(''mysub')/e" file1.txt
于 2012-10-01T23:06:03.550 に答える
1

何十年もVMSシステムを見たことがありませんが、...あなたの印章から逃れますか?

$ mysub = "disk\$data1:[path.to]file.txt"

または多分

$ mysub = "disk\\$data1:[path.to]file.txt"

于 2012-10-01T18:10:10.503 に答える
1

または派生物のためshに、私は使用します

perl -pe'BEGIN { $r = shift(@ARGV) } s/baz/$r/' "$mysub" file1.txt

それ以外の場合は、の値をmysubPerl文字列リテラルに変換する必要があります。それはもっと複雑になるでしょう。シェルに相当するものを見つけます。

OPによる編集:

はい、これは機能します。VMSに相当するものは

perl -pe "BEGIN { $r = shift(@ARGV) } s/baz/$r/" 'mysub' file1.txt
于 2012-10-01T18:18:02.907 に答える
0

でエスケープする必要が$あり\$ます。それ以外の場合、Perlは変数参照を確認し、正規表現が評価される前に文字列$data1をの内容に置き換えます。$data1あなたが定義しなかったので$data1、もちろん、それは空です。

于 2012-10-01T18:06:44.753 に答える
0

次のコードを使用できます。

$ mysub='disk\$data1:[path.to]file.txt'
$ perl -pe 's/baz/'$mysub'/' FILE
foo
bar
disk$data1:[path.to]file.txt
quux
于 2012-10-01T18:12:33.280 に答える
0

DCLシンボルの代わりに論理名を使用してみることができます。

$ define mysub "disk$data1:[path.to]file.txt"
$ $ perl -pe "s/baz/mysub/" file1.txt
于 2012-10-24T16:27:06.840 に答える
-1

sedを使用します。

Sedは$data1変数として補間しようとしないので、必要なものを取得する必要があります。

$ sed -e "s/baz/''mysub'/" file1.txt
于 2012-10-01T18:02:28.033 に答える