使用 sed 替换字符串的一部分

rat*_*lan 7 bash sed

我打算替换文件中的某些字符串;所以我正在使用 sed。

我想替换字符串,而 sed 读取字符串并将文本附加到字符串的中间。

例子:

string in myfile : user=blabla
string that I want to obtain: user=bob
Run Code Online (Sandbox Code Playgroud)

所以我以这种方式运行 sed,让它搜索“user=”字符串,并将其替换为“user=bob”

sed -i 's/user=*/user=bob/' myfile
Run Code Online (Sandbox Code Playgroud)

我得到的是

user=bobblabla
Run Code Online (Sandbox Code Playgroud)

基本上 sed 认为我只想替换那部分,而我想用新字符串替换整个字符串。我认为 * 会告诉 sed 考虑之后的任何事情,但它不起作用。

因为我不知道“blabla”是什么,所以我不能把它放在 sed 命令中。我如何告诉 sed 查找以“user=”开头的字符串并将整个字符串替换为新字符串?

gar*_*ohn 9

您似乎将 shell 模式与正则表达式混淆了。在 shell 模式中,*表示零个或多个任何字符。在正则表达式中,这是sed它的模式所期望的,*意味着前一个原子的零个或多个。在您的示例中,该原子是=. 因此,sed正在搜索user后跟零个或多个=并将匹配的字符串替换为user=bob. 您想要的模式是user=.*user=后跟任意字符 ( .) 零次或多次,使您的sed命令:

sed -i 's/user=.*/user=bob/' myfile
Run Code Online (Sandbox Code Playgroud)


Sad*_*nny 5

正如加里约翰所说,你的正则表达式错了。(* -> .*)

但我会更进一步,当你在做的时候......我不知道你的文件实际上是什么样的,但为了练习,我会考虑让你的搜索/替换操作更安全一些。

假设你想在一个文件上运行这个东西,如下所示:

user=john
superuser=jimmy      # don't want to change this line!
user=L33t_us3rn4m3   # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello
Run Code Online (Sandbox Code Playgroud)

使用您当前的 sed 语法,这将是非常错误的。为了使其更具体一点,您可以尝试:

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile
Run Code Online (Sandbox Code Playgroud)

这会:

  • 仅当该行实际以“user”(^)开头时触发
  • 仅更改包含 0 个或多个字母、数字或下划线的“user=”
  • 保留用户名后面的所有内容(即我的示例中的注释)

这绝不是一个超级安全的东西,可以在您想要重命名用户的任何地方随时随地工作。显然,这取决于您的配置文件的设置方式以及您期望遇到的情况。但我的回答是为了提供一些“深思熟虑”,因为给定一个(数量)配置文件足够大,以至于有这么多用户名不想手动执行此操作,盲目地替换“user=.*” “似乎可能很危险。您可能需要花一些时间来完善这些类型的操作:)

祝你好运。