![使用 sed 将单引号内的文本替换为另一个字符串(仅是正则表达式的第一次出现)](https://linux22.com/image/1207480/%E4%BD%BF%E7%94%A8%20sed%20%E5%B0%86%E5%8D%95%E5%BC%95%E5%8F%B7%E5%86%85%E7%9A%84%E6%96%87%E6%9C%AC%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%88%E4%BB%85%E6%98%AF%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%EF%BC%89.png)
我有一个包含以下内容的文件:
$ cat file.txt
CREATE COLLATION public.collation123 (provider = libc, locale = 'fr-FR');
CREATE COLLATION public.collation_1 (provider = libc, locale = 'bas');
CREATE COLLATION public.collation_test (provider = libc, locale = 'fr-FR');
我想更换第一次出现与。locale = 'fr-FR'
locale = 'fr_FR.utf8'
替换后文件应具有以下内容:
$cat file.txt
CREATE COLLATION public.collation123 (provider = libc, locale = 'fr_FR.utf8');
CREATE COLLATION public.collation_1 (provider = libc, locale = 'bas');
CREATE COLLATION public.collation_test (provider = libc, locale = 'fr-FR');
答案1
使用 GNU sed,您可以使用特殊的双地址形式0,/regexp/
将替换命令限制在直到第一个实例的范围内:
$ cat file.txt
CREATE COLLATION public.collation123 (provider = libc, locale = 'fr-FR');
CREATE COLLATION public.collation_1 (provider = libc, locale = 'bas');
CREATE COLLATION public.collation_test (provider = libc, locale = 'fr-FR');
$ sed "0,/'fr-FR'/s//'fr_FR.utf8'/" file.txt
CREATE COLLATION public.collation123 (provider = libc, locale = 'fr_FR.utf8');
CREATE COLLATION public.collation_1 (provider = libc, locale = 'bas');
CREATE COLLATION public.collation_test (provider = libc, locale = 'fr-FR');
LHS 上的空模式导致s/pattern/replacement
它重新使用地址中的前一个模式。
当然,如果你知道你只想在第一行进行替换,你可以使用更简单的"1s/'fr-FR'/'fr_FR.utf8'/"