[英]Perl one-liner to expand Unix environment variables
我有一個Perl腳本,用於擴展Unix環境變量。 該腳本運行正常。 腳本如下:
# I know this should not be typed here. This is here just for testing.
@ENV{qw(LKUP_DIR DATA_DIR CTRL_DIR MMM)} = qw(/appl1/TSS/lkup /appl1/TSS/data /appl1/TSS/ctrl Oct);
while ( <DATA> )
{
my $line=$_;
chomp $line;
$line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : '$'.$1 }ge;
$line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : '${'.$1.'}' }ge;
print "$line\n";
}
__DATA__
${LKUP_DIR}/lookup_file.txt
${CTRL_DIR}/ctrl_file_$MMMM.txt
$CTRL_DIR/ctrl_file_$MMM.txt
我想將該腳本轉換為單行腳本,但是我不確定如何處理上述腳本中使用的正則表達式中$周圍的單引號。 我嘗試了下面的方法,但是它當然不起作用:
perl -lne '$line=$_; $line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : '$'.$1 }ge; $line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : '${'.$1.'}' }ge; print "$line";' DATA.txt
有什么建議么? (我只想在Perl中這樣做。)
我同意@Mat:這似乎是個壞主意。 這將只是一行,但您會失去可讀性。 試想一下,您可能會在一年后進行編輯,但仍會嘗試了解單線紙的功能。
但是無論如何,在Perl中,您可以使用q/STRING/
而不是'STRING'
。
perl -lne '$line=$_; $line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : q/$/.$1 }ge; $line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : q/${/.$1.q/}/ }ge; print "$line";' DATA.txt
這是腳本的更簡潔版本。 一個顯着的區別是我使用//
代替了exists
。 我認為在環境變量方面的差異可以忽略不計。 如果環境變量存在但未定義,它是什么? 如果確實未定義,則在perl打印它時會引起警告。
perl -wpe 's#\${?(\w+)}?# $ENV{$1} // $& #ge;' DATA.txt
如果您仍然堅持使用exist
,則只需使用:
perl -wpe 's#\${?(\w+)}?# exists $ENV{$1} ? $ENV{$1} : $& #ge;' DATA.txt
我做了什么:
$line
-l
選項 -n
並用-p
print
{}
}?
組合正則表達式}?
作為可選匹配 $&
-整個比賽-而不是嘗試將比賽的各個部分重新拼合在一起
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.