如何用 sed 替换配置文件中第一次出现的键值?

How do I replace the first occurance of a key value in a config file with sed?

我想更改配置文件中的应用程序名称。 Name= 有多次出现,但我只想更改第一个。作为参考,配置文件具有以下结构:

[Desktop Entry]
Version=1.0
Name=name
Name[ar]=...
[...]
[Desktop Action new-window]
Name=Open a New Window
[...]

到目前为止我尝试的是 bash 命令 sed:

sudo sed "0,/Name/s/=.*$/=Replace/" app_desktop_configs/std_firefox.desktop

主要做了我想要的,但是也替换了版本号:

[Desktop Entry]
Version=Replace
Name=Replace
Name[ar]=...
[...]

也欢迎使用 sed 的替代解决方案:)

所以完全匹配 Name= 而不是 =.*

sed '0,/^Name=/s/^Name=.*/Name=Replace/'

Perl 解决方案:

perl -i.bak -pe 'unless ( $cnt ) { s{Name=name}{Name=replace} and $cnt++; } ' infile

Perl one-liner 使用这些命令行标志:
-e :告诉 Perl 查找代码 in-line,而不是在文件中。
-p :一次循环输入一行,默认情况下将其分配给 $_ 。在每次循环迭代后添加 print $_
-i.bak:编辑输入文件in-place(覆盖输入文件)。覆盖之前,通过在其名称后附加扩展名 .bak.

来保存原始文件的备份副本

另请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perlre: Perl regular expressions (regexes)

这可能适合您 (GNU sed):

sed -E '/(name=).*/{s//Replace/;:a;n;ba}' file

或者:

sed -E 's/(name=).*/Replace/;T;:a;n;ba' file

或者:

sed  -E 'x;/./{x;b};x;/(name=).*/h;s//Replace/' file

以上所有解决方案都会修改第一次出现的name,然后继续到文件末尾,不再做任何修改。