我想在命令文件中保留一个替换列表:
subs.sed
s/hello/foo/g
s/world/bar/g
我这样运行sed -i -f subs.sed file.txt
file.txt
从hello world
变成foo bar
。
不过,我想阻止这种情况的发生:如果file.txt
是helloworld
,我不希望上述两个替换中的任何一个发生。当前的输出是foobar
,但我希望输出是helloworld
。
我可以在命令文件中手动指定单词边界:
s/\<hello\>/foo/g
s/\<world\>/bar/g
但我更愿意让这个文件尽可能地易于阅读,而不是用这种冗长的方式来掩盖它。
是否有一个命令行选项可以使它sed
自己只匹配整个单词?当然,如果有另一种编辑命令行的方法(在使用它运行 sed 之前在命令文件上运行 sed?但我担心解析复杂的替换)尽可能地防弹,那也很棒。
这是 Ubuntu 22.04 上的 GNU sed
首先,如果您运行的是 GNU
sed
(Linux 系统上的默认设置),您还可以简化您的sed
using\b
而不是\>
并且\<
这可能使它对您来说更易读:也就是说,我认为您不能按照您的描述进行操作,但这里有一个解决方法:保持文件原样,但添加一个预处理步骤:
在这里,我们将两个命令传递给
sed
. 第一个将替换第一次出现的/
with/\<
,第二个将替换第二个/
with/\>
。我们需要\\>
并且\\<
因为\
是转义字符,所以我们需要通过添加另一个\
将其视为文字反斜杠来转义它。然后,2
在第二个命令末尾的意思是“在该行的第二个匹配项上执行此操作”。这更容易通过示例来解释:因此,使用该命令,您可以创建一个小别名来运行您的实际替换,只要您使用的 shell 可以理解
<()
Process Substitution:而且,为了让您的生活更轻松一些,您可以将此行添加到您的 shell 的初始化文件(
~/.bashrc
例如)以创建别名:打开一个新终端,您现在可以运行
mysub file
并获得预期的输出。