我有一个文本文件,想要使用 sed 替换以下字符串(包括“s”):
" rel="lightbox[1846]" title="
和
#
[
和之间的数字]
是可变的并且会变化。
我想将 包含"
在替换中。
我一直在阅读通配符,认为.
会在某种程度上有所帮助——与*
我习惯的通配符不同。
答案1
sed -E 's/" rel="lightbox\[[0-9]+\]" title="/#/g' filename
答案2
sed
确实是完成这项工作的正确工具,它具有s
命令(最常用的命令)。
shell 中文件名的通配符以及 和 等工具中的正则表达式grep
具有sed
不同的语法。看为什么我的正则表达式在 X 中有效但在 Y 中无效?差异摘要。
在要替换的文本中,[
是正则表达式的特殊字符;其他角色代表他们自己。由于它是一个特殊字符,因此需要写为\[
(反斜杠使下一个字符代表其自身而不具有其特殊含义)。
数字序列是[0-9]*
:[0-9]
表示“任意数字”,*
表示“重复前面的字符或字符集0次或多次”。
因此:
sed 's/" rel="lightbox\[[0-9]]" title="/#/' <old-file >new-file
单引号使 shell 将其间的所有内容按字面意思传递给sed
命令。
答案3
怎么样:
sed 's/^" rel=.*title="/#/g' filename
这利用了您在问题中引用的.
和 the*
来匹配字符串中间可以变量的字符。经过测试并知道可以达到您指定的所需结果。
尽管我只是使用了字符串开头和结尾的一小部分文本样本,但如果有可能无意中匹配到不需要的字符串,您可能会更加精确。
答案4
sed 's/" rel="lightbox[[0-9]+]" title="/#/g' 文件名
但是如果你想在 perl 中使用它,你必须像下面这样使用它
`sed 's/" rel="lightbox\[[0-9]+\]" title="/#/g' 文件名