如何用 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
,然后继续到文件末尾,不再做任何修改。
我想更改配置文件中的应用程序名称。 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
,然后继续到文件末尾,不再做任何修改。