用sed替换方括号之间的字符串

Røn*_*ler 3 string replace brackets sed

我在文本文件中有一些字符串,如下所示:

[img:3gso40ßf]
Run Code Online (Sandbox Code Playgroud)

我想将它们替换为普通的BBCode:

[img]
Run Code Online (Sandbox Code Playgroud)

我怎么能用sed做到这一点?我试过这个,但它没有做任何事情:

sed -i 's/^[img:.*]/[img]/g' file.txt
Run Code Online (Sandbox Code Playgroud)

jub*_*0bs 11

逃避那些方括号

方括号是元字符:它们在POSIX正则表达式中具有特殊含义.如果你的意思[] 字面意思,你需要在正则表达式中逃避这些字符:

$ sed -i .bak 's/\[img:.*\]/\[img\]/g' file.txt
Run Code Online (Sandbox Code Playgroud)

[^]]*而不是.*

因为*贪婪,.*会比你想要的更多; 看Jidder的评论.要解决这个问题,请使用[^]]*,它捕获最先]遇到(但不包括)第一个遇到的字符序列.

$ sed -i .bak 's/\[img:.[^]]\]/\[img\]/g' file.txt
Run Code Online (Sandbox Code Playgroud)

你使用的sed -i语法不正确吗?

(感谢ja 的评论.)

根据sed您使用的风格,可以允许您使用sed -i而不指定任何<extension>参数,如

$ sed -i 's/foo/bar/' file.txt
Run Code Online (Sandbox Code Playgroud)

但是,在其他版本中sed,例如Mac OS X附带的版本,sed -i 需要强制 <extension>参数,如

$ sed -i .bak 's/foo/bar/' file.txt
Run Code Online (Sandbox Code Playgroud)

如果省略该扩展参数(.bak,此处),则会出现语法错误.您应该查看您sed的手册页,以确定该参数是可选的还是必需的.

匹配特定数量的字符

有没有办法告诉sed结肠后总有8个随机字符?

就在这里.如果冒号和结束方括号之间的字符数始终相同(8,此处),则可以使命令更具体:

$ sed -i .bak 's/\[img:[^]]\{8\}\]/\[img\]/g' file.txt
Run Code Online (Sandbox Code Playgroud)

# create some content in file.txt
$ printf "[img:3gso40ßf]\nfoo [img:4t5457th]\n" > file.txt

# inspect the file
$ cat file.txt
[img:3gso40ßf]
foo [img:4t5457th]

# carry out the substitutions
$ sed -i .bak 's/\[img:[^]]\{8\}\]/\[img\]/g' file.txt

# inspect the file again and make sure everything went smoothly
$ cat file.txt
[img]
foo [img]

# if you're happy, delete the backup that sed created
$ rm file.txt.bak
Run Code Online (Sandbox Code Playgroud)