簡體   English   中英

Perl一線式擴展Unix環境變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM