我打算替换文件中的某些字符串;所以我正在使用 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=”开头的字符串并将整个字符串替换为新字符串?
您似乎将 shell 模式与正则表达式混淆了。在 shell 模式中,*表示零个或多个任何字符。在正则表达式中,这是sed它的模式所期望的,*意味着前一个原子的零个或多个。在您的示例中,该原子是=. 因此,sed正在搜索user后跟零个或多个=并将匹配的字符串替换为user=bob. 您想要的模式是user=.*,user=后跟任意字符 ( .) 零次或多次,使您的sed命令:
sed -i 's/user=.*/user=bob/' myfile
Run Code Online (Sandbox Code Playgroud)
正如加里约翰所说,你的正则表达式错了。(* -> .*)
但我会更进一步,当你在做的时候......我不知道你的文件实际上是什么样的,但为了练习,我会考虑让你的搜索/替换操作更安全一些。
假设你想在一个文件上运行这个东西,如下所示:
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=.*” “似乎可能很危险。您可能需要花一些时间来完善这些类型的操作:)
祝你好运。
| 归档时间: |
|
| 查看次数: |
27126 次 |
| 最近记录: |