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的手册页,以确定该参数是可选的还是必需的.
就在这里.如果冒号和结束方括号之间的字符数始终相同(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)