Bash 使用sed仅替换第一次出现,而使用变量和/&引用;可变的

Bash 使用sed仅替换第一次出现,而使用变量和/&引用;可变的,bash,sed,Bash,Sed,我有一个像这样的文件 I/am/a/string I'm/still/a/string Always/a/string 我试图使用sed将第一次出现的“string”替换为包含“/”like的变量 因此,sed的输出将是 I/am/a/ive/been/replaced 因为我只想要第一次出现,我使用的变量通常是您使用的 sed -i "0,/string/s//$x/" file 但是在这种情况下,因为变量有“/”我必须使用不同的分隔符,如 sed "0,|string|s||$x|

我有一个像这样的文件

I/am/a/string
I'm/still/a/string
Always/a/string
我试图使用sed将第一次出现的“string”替换为包含“/”like的变量

因此,sed的输出将是

I/am/a/ive/been/replaced
因为我只想要第一次出现,我使用的变量通常是您使用的

sed -i "0,/string/s//$x/" file  
但是在这种情况下,因为变量有“/”我必须使用不同的分隔符,如

sed "0,|string|s||$x|" file
但这是行不通的

我错过了什么

注:


如果您可以使用
awk
:您可以在第一次更换后打印并退出,我希望在sed中完成此操作

awk -v x="${x}" '{gsub(/string/,x);print ;exit}' file
I/am/a/ive/been/replaced
sed
version:这将在第一次匹配后退出,请注意,搜索字符串“string”仍在
/
中,而替换部分使用不同的分隔符

sed -n   "0,/string/ s|string|$x|p"   
I/am/a/ive/been/replaced

我试图避免使用awk sed,因为它会更短,更直截了当。如果不可能,我理解,但除此之外,这会活活吃掉我。您希望
string
被视为一个文本字符串还是一个正则表达式,并对它可以包含的字符进行额外限制?您想要一个适用于任何
x
的解决方案,还是只在
x
包含某些字符子集时才有效?如果您希望解决方案将
string
视为具有附加限制的regexp,并且只在
x
不包含某些字符时才起作用,那么您希望在sed中这样做是正确的。如果/当您希望它适用于任何字符的文字字符串时,请告诉我们,我们可以提供一个awk解决方案。
sed -n   "0,/string/ s|string|$x|p"   
I/am/a/ive/been/replaced