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

<强>之前:

  

Hello $ {USER_NAME},您住在哪里   $ {} HOME_ADDRESS。它现在是$ {TIME}

<强>后:

  

Hello $ {userName},你住在哪里   $ {}是homeAddress。现在是$ {time}

$ {}中出现的不同令牌数量很大,因此运行起来并不可行:

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的原因。是否可以在一个命令中执行此操作?

干杯, 敦尔

有帮助吗?

解决方案

sed的 -i 标志将就地编辑文件。对于XXX和YYY,您可以使用以下内容:

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

等等。

更新:我发现您的问题实际上是关于更改“USER_NAME”的问题。进入“userName”自动。你可以尝试这个Perl脚本:

sub convert {
    my $r = lc 

sed的 -i 标志将就地编辑文件。对于XXX和YYY,您可以使用以下内容:

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

等等。

更新:我发现您的问题实际上是关于更改“USER_NAME”的问题。进入“userName”自动。你可以尝试这个Perl脚本:

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}

示例输出:

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

像这样运行:

<*>

示例输出:

<*>

其他提示

为清晰起见而格式化:

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

其中 / ^ Hello / 标识您希望操作的行(如果需要,使其更具体),其余的替换每个变量名称。


如果将其写入脚本,请考虑使用HERE文档来保持格式化并使其更易于阅读和更新...

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

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

它们在功能上是相同的(除了我的转储到stdout;你必须把它放在某个地方(但是你要保留原件以防万一,就像e,你经常弄乱你的正则表达式。)我喜欢我的配方只是因为我可以从一个sed命令开始,然后使用

添加更多
!! | sed 'yet-enother-regexp'

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top