我有一个脚本需要替换包含特定短语的第一行。它不应替换任何其他文本行。
使用这个:
sed -i '1,/old/ s/.*old.*/new/' temp
这会正确地将包含“旧”的整行替换为“新”。但我注意到,如果“旧”位于第一行,则这不起作用。我尝试使用 0 而不是 1,但它根本不起作用,无法替换。
如果有人有其他方法可以在第一行工作,请告诉我。
临时文件的内容是:
line 1 has 'old value' here.
line 2 has 'old value' here.
sed
这是在用作BusyBox 一部分的嵌入式设备上。
版本有:
BusyBox v1.29.3 (2022-11-02 08:55:42 PDT) multi-call binary.
$ sed --version
This is not GNU sed version 4.0
$
BusyBox 的 C 源代码sed
发布于:https://github.com/brgl/busybox/blob/master/editors/sed.c
我认为“这不起作用”是指替换的行数超出了预期。
您正在范围测试中使用替代命令。
形式为:地址1
,
地址2 命令地址通常指定为绝对数字
$
(文件的最后一行)或正则表达式。重要的一点是,直到与address1匹配的行之后的行才会发生对address2的测试。
在你的命令下:
1
=地址1/old/
=地址2这意味着
/old/
直到第 2 行才检查。GNU sed 有一个非标准扩展,其中address1可以是
0
,这意味着范围从文件的开头(名义上的第 0 行)开始,而对address2的测试从第一行开始。busybox sed 似乎不支持该扩展。您可以将脚本重写为,例如:
指定空正则表达式以
s///
重用上一个应用的命令中使用的最后一个 RE。这可能对你有用(GNU sed):
使用该
-z
选项将文件放入内存中,并使用多行替换标志来替换包含by 的m
第一行。old
new