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


3

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

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

例:

string in myfile : user=blabla
string that I want to obtain: user=bob

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

sed -i 's/user=*/user=bob/' myfile

我得到的是

user=bobblabla

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

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

Answers:


6

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

sed -i 's/user=.*/user=bob/' myfile

太棒了,非常感谢!点告诉任何字符,因此星号将匹配任何字符的零个或多个,直到字符串的结尾。
rataplan 2015年

2

正如GaryJohn所说,你得到了正则表达式错误。(* - >。*)

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

假设你想在这样的文件上运行这个东西:

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

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

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile

这将:

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

这绝不是一个超级安全的东西,它可以随时随地用于重命名用户。显然,这取决于配置文件的设置方式以及预期会遇到的情况。但是我的回答是为了给出一些“思考的东西”,因为给定(大量)配置文件足够大,可以期望很多用户名不想手动执行此操作,盲目地替换“user =。* “似乎很危险。您可能希望花一些时间来完善这些操作:)

祝好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.