什么是perl one liner来替换字符串中的子字符串?

时间:2014-08-14 15:27:35

标签: perl csh

假设您已获得此C shell脚本:

setenv MYVAR "-l os="\""redhat4.*"\"" -p -100"
setenv MYVAR `perl -pe "<perl>"`

替换为将替换&#34; -p -100&#34;用&#34; -p -200&#34;在MYVAR中,如果不存在则添加它,如果可能的话,使用一个衬垫。

2 个答案:

答案 0 :(得分:2)

你想要的东西看起来像

perl -e'                                             \
   use Getopt::Long qw( :config posix_default );     \
   use String::ShellQuote;                           \
   GetOptions(\my %opts, "l=s", "p=s") or die;       \
   my @opts;                                         \
   push @opts, "-l", $opts{l} if defined($opts{l});  \
   push @opts, "-p", "-100";                         \
   print(shell_quote(@opts));                        \
' -- $MYVAR
  • 首先,您需要解析命令行。这需要知道它们所针对的应用程序的参数的格式。

    例如,-n是以下选项:

    perl -n -e ...
    

    然而,-n不是以下选项:

    perl -e -n ...
    

    上面,我在POSIX模式下使用了Getopt :: Long。您可能需要调整设置或使用完全不同的解析器。

  • 其次,您需要生成csh个文字。

    我尝试解决csh有缺陷的引用时遇到了不好的经历,所以我会把这些细节留给你。上面,我使用String :: ShellQuote的shell_quote生成sh(而不是csh)文字。你需要调整。


当然,一旦你做到这一点,你需要将结果返回到环境变量unmangled。我不知道csh是否有可能。我再次将csh引用留给你。

答案 1 :(得分:0)

该主题与内容不对应,但我认为如果有人发布主题问题的答案可能会有用。所以这是perl-oneliner:

echo "my_string" | perl -pe 's/my/your/g'