使用 sed 替换包含可变整数的字符串

使用 sed 替换包含可变整数的字符串

我有一个文本文件,想要使用 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' 文件名

相关内容