代码之家  ›  专栏  ›  技术社区  ›  Dónal

如何更改模板中替换变量的格式

  •  3
  • Dónal  · 技术社区  · 16 年前

    我需要迭代目录中的文件并执行以下替换。

    之前:

    您好,用户名,您住在 $家庭地址。现在是时间

    后:

    您好,用户名,您住在 $家庭住址。现在是时间

    在$内出现的不同令牌的数量很大,因此运行它并不真正可行:

    find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
    find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;
    

    等。

    我希望可以使用一个命令来执行这个替换,它看起来像:

    find . -name '*' -exec sed 's/XXX/YYY/g' {} \;
    

    但我不知道用什么来代替XXX和YYY。是否可以在单个命令中执行此操作?

    干杯, 多纳

    3 回复  |  直到 16 年前
        1
  •  2
  •   Greg Hewgill    16 年前

    这个 -i SED的标志将就地编辑文件。对于XXX和YYY,您将使用如下内容:

    sed -i 's/USER_NAME/userName/g'
    

    等等。

    更新:我发现你的问题实际上是关于自动将“用户名”改为“用户名”。您可以尝试这个Perl脚本:

    sub convert {
        my $r = lc $_[0];
        $r =~ s/_(.)/\U$1\E/g;
        return $r;
    }
    while (<>) {
        s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
        print;
    }
    

    像这样运行:

    perl -i convert.pl inputfile.txt
    

    样品输出:

    $ cat inputfile.txt
    Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
    $ perl -i convert.pl inputfile.txt
    $ cat inputfile.txt
    Hello ${userName}, you live at ${homeAddress}. It is now ${time}
    
        2
  •  4
  •   dmckee --- ex-moderator kitten    16 年前

    格式清晰:

    sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                       s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                       s/\$\{TIME\}/\$\{time\}/g
                      }'
    

    在哪里? /^Hello/ 标识要执行的行(如果需要,可以更具体一些),其余的行替换每个变量名。


    如果将其写入脚本,请考虑使用此处文档保留格式并使其更易于读取和更新…

        3
  •  0
  •   bog    16 年前

    上面的答案非常有效。为了完整起见,我可以补充一点,您可以:

    sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
       | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
       | sed 's/\$\{TIME\}/\$\{time\}/g'
    

    它们在功能上是相同的(除了我的转储到stdout;你必须把它放在某个地方(但是你必须保留原始文件,以防像e一样,你经常在regexp上出错)。我喜欢我的公式,因为我可以从一个sed命令开始,然后用

    !! | sed 'yet-enother-regexp'
    

    箭头键?VI模式?谁需要这些东西?:)