use*_*915 5 command-line text-processing
我被更换<B>,并</B>用<STRONG>和</STRONG>在文件中。这有点像替换 hmtl 标签。我用过sed 's/\<B\>/STRONG/g'。它完成了这项工作,但如果在文件中[B]并且[/B]存在。然后它们也被更改为[STRONG]和[/STRONG]。我不明白它背后的逻辑。
默认情况下,sed 使用基本的正则表达式。这意味着 GNU 允许\<匹配单词的开头并\>匹配单词的结尾。观察:
$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG
Run Code Online (Sandbox Code Playgroud)
\<B\>匹配B在上述字符串中出现两次的单词。因为它匹配单词B而不是尖括号,所以尖括号保持不变。
如果要匹配尖括号, <>,请关闭反斜杠:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
Run Code Online (Sandbox Code Playgroud)
<B>匹配左尖括号,B后跟右尖括号。因此,<B>被替换为<STRONG>但B被留下。
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
Run Code Online (Sandbox Code Playgroud)
-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>
Run Code Online (Sandbox Code Playgroud)
<并且>不是Basic Regular Expressions 中的特殊字符,所以它们不应该被转义。当您转义它们时,sed将尝试将它们视为特殊字符,然后行为未定义:
以 a ( '\' ) 开头的普通字符的解释是未定义的,除了:
- 字符 ')'、'('、'{' 和 '}'
- 数字 1 到 9(包括匹配多个字符的 BRE)
- 括号表达式中的字符
因此,只需使用<且>无需转义:
$ echo 'b<b>' | sed 's/<b>/strong/'
bstrong
Run Code Online (Sandbox Code Playgroud)