我在文本文件中有一些如下所示的字符串:
[img:3gso40ßf]
我想将它们替换为正常的BBCode:
[img]
我如何用sed做到这一点?我尝试了这个,但是它什么也没做:
sed -i 's/^[img:.*]/[img]/g' file.txt
方括号是元字符:它们在POSIX正则表达式中具有特殊含义。如果你的意思[
和]
字面意思,你需要逃避你的正则表达式的字符:
$ sed -i .bak 's/\[img:.*\]/\[img\]/g' file.txt
[^]]*
代替.*
因为*
贪婪,.*
会比你想要的捕获更多;参见吉德的评论。要解决此问题,请使用[^]]*
,它捕获直到(但不包括)第一个]
遇到的字符序列。
$ sed -i .bak 's/\[img:.[^]]\]/\[img\]/g' file.txt
sed -i
语法不正确吗?(感谢ja的评论。)
根据sed
您所使用的风格,可能允许您在sed -i
不指定任何<extension>
参数的情况下使用,例如
$ sed -i 's/foo/bar/' file.txt
但是,在其他版本的中sed
,例如Mac OS X附带的版本,sed -i
需要强制性 <extension>
参数,例如
$ sed -i .bak 's/foo/bar/' file.txt
如果您省略该扩展参数(.bak
,此处),则会出现语法错误。您应该查看自己sed
的手册页,以确定该参数是可选的还是强制性的。
就在这里。如果冒号和右方括号之间的字符数始终相同(此处为8),则可以使命令更具体:
$ sed -i .bak 's/\[img:[^]]\{8\}\]/\[img\]/g' file.txt
# 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句