我在文件中用<B>
和替换</B>
和<STRONG>
。这有点像替换 hmtl 标签。我用了。它完成了工作,但如果文件中存在 和 。那么它们也会被更改为和。我不明白这背后的逻辑。</STRONG>
sed 's/\<B\>/STRONG/g'
[B]
[/B]
[STRONG]
[/STRONG]
答案1
默认情况下,sed 使用基本正则表达式。这意味着 GNU lets\<
匹配单词的开头和\>
结尾。观察:
$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG
\<B\>
B
匹配上述字符串中出现两次的单词。由于它匹配单词B
而不是尖括号,因此尖括号保持不变。
如果要匹配尖括号,<>
请保留反斜杠:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B>
匹配后跟B
闭尖括号的开尖括号。因此,<B>
被替换为,<STRONG>
但B
保留原样。
捕捉开始和结束标签
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
-r
是扩展正则表达式,但 GNU sed 的最新版本也支持-E
将其作为同义词-r
。BSD sed 使用-E
此名称,并且据报道,未来的 POSIX 标准已采用-E
。因此,出于兼容性考虑,可能需要使用(感谢@Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
答案2
<
并且>
不是特殊字符基本正则表达式,因此不应对其进行转义。当您对其进行转义时,sed
将尝试将其视为特殊字符,然后行为是不明确的:
对于以 ('\') 开头的普通字符的解释是未定义的,但以下情况除外:
- 字符 ')'、'('、'{' 和 '}'
- 数字 1 至 9(见匹配多个字符的 BRE)
- 括号表达式内的字符
因此,只需使用<
且不>
转义:
$ echo 'b<b>' | sed 's/<b>/strong/'
bstrong
答案3
解决方案awk
。这里我有一个示例文件,其中包含两行和标签并使用gsub
函数替换它们。然后我们将其输出到临时文件并返回到原始文件。完成后删除临时文件。根据需要进行调整。
$ cat tags.txt
<B> and </B>
<B> or </B>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt
<STRONG> and </STRONG>
<STRONG> or </STRONG>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt > tmpfile.txt && cat tmpfile > tags.txt