1

我需要在字符串中的某些单词周围添加一些自定义语法。举个简单的例子,所有包含“A”或“B”的单词都应该分别被“<code><red>”和“<code></red>”包围,所有包含“H”或“F”的单词应该被“<code><blue>”和“<code></blue>”包围,其他单词被忽略。请参阅此示例字符串:

THE BEAR ATE THE FISH

该行变为:

<blue>THE</blue> <red>BEAR</red> <red>ATE</red> <blue>THE</blue> <blue>FISH</blue>
  • 我已经在字符串的开头和结尾添加了空格,因此任何代码都可以使用空格轻松区分单词。
  • 如果一个词包含多个匹配,它可以被标记两次,例如“<code>AFRICA”变成“<code><blue><red>AFRICA</red></blue>”。

如何在包含某些字母的单词周围添加此自定义语法?

4

2 回答 2

2

如果awk允许解决方案:

$ foo="THE BEAR ATE THE FISH AFRICA"
$ echo "${foo}" | awk '{
      gsub(/[^[:space:]]*(A|B)[^[:space:]]*/, "<red>&</red>");
      gsub(/[^[:space:]]*(H|F)[^[:space:]]*/, "<blue>&</blue>")
  }1'
<blue>THE</blue> <red>BEAR</red> <red>ATE</red> <blue>THE</blue> <blue>FISH</blue> <blue><red>AFRICA</red></blue>

这将保持空白并确保<blue><red></red></blue>两者都匹配。如果两者都不是要求,请选择 shell 解决方案。

于 2013-04-20T12:05:40.693 回答
1

POSIX shell 解决方案

(也适用于

#!/bin/sh

x='THE BEAR ATE THE FISH IN AFRICA'

for i in $x; do
    case $i in
        *A*|*B*)
            case $i in
                *H*|*F*)
                    printf "<blue><red>$i</red></blue>"
                    ;;
                *)
                    printf "<red>$i</red>"
                    ;;
            esac
            ;;
        *H*|*F*)
            printf "<blue>$i</blue>"
            ;;
    esac
done

输出

<blue>THE</blue><red>BEAR</red><red>ATE</red><blue>THE</blue><blue>FISH</blue>
<blue><red>AFRICA</red></blue>
于 2013-04-20T12:17:32.237 回答