使用正则表达式将括号括在一个单词周围

时间:2016-06-02 23:16:59

标签: regex bash sed

我正在尝试使用bash来修复一些具有数学模式符号的SVN提交,因为我为我的报告创建了一个神奇的SVN到LaTeX纸张生成器。我正在尝试在其中找到包含插入符号(^)的任何内容并将\(match\)放入其中。

到目前为止我所拥有的:

MYVAR="This is not x^2 good without y^2x^3 extra latex brackets"
echo $MYVAR | sed -e '\b\w*([\^])\w*\b/g'  

但我不清楚如何进行多场比赛并放置\(match\)。 我想最后的字符串是:

 "This is not \(x^2\) good without \(y^2x^3\) extra latex brackets"

任何例子都将不胜感激。我有某种心理障碍。

3 个答案:

答案 0 :(得分:2)

没有sed,但你可以使用Perl:

echo "$MYVAR" | perl -pe 's/([\w^]+^[\w^]+)/\/\(\1\)\//g'

解释

匹配

(   # Start a capturing group
    [    # Start a character set
        \w    # Match words (alphanum & underscores)
        ^     # Match carets
    ]    # Close character set
    +    # Match 1 or more of previous token
    \^   # Match Escaped caret
    [    # Start a character set
        \w    # Match words (alphanum & underscores)
        ^     # Match carets
    ]    # Close character set
    +    # Match 1 or more of previous token
)   # Close capturing group

更换

\/    # Escaped /
\(    # Escaped (
\1    # Captured token #1
\)    # Escaped )
\/    # Escaped /

答案 1 :(得分:1)

sed 's,[^^[:space:]]*^[^[:space:]]*,\\(&\\),g'

[^^[:space:]]*^[^[:space:]]*将匹配包含至少一个插入符号的任何非空格字符集。

\\(&\\)&符号将被整个匹配替换,并用括号括起来。

答案 2 :(得分:1)

func configureCell(item:Item,image:UIImage?){ self.item = item if image != nil{ //The image exist so you assign it to your UIImageView img.image = image }else{ //Create the request to download the image } } 之类的表达式可以描述为“由y^2x^3”组成的字符组包围的“^”。使用GNU sed(使用^选项,所以我们不必太多逃避),你可以表达为

-r

或更多,带括号表达式(不能在那些中使用(\w|\^)+\^(\w|\^)+

\w

要将它们放在[[:alnum:]^]+\^[[:alnum:]^]+ 之间,我们进行替换以添加括号:

\( \)

我稍微扩展了这个例子,以展示它在字符串的开头或结尾是如何工作的。

这远非万无一失:它会很乐意接受$ myvar="a^2 This is not x^2 good without y^2x^3 extra latex brackets b^5" $ sed -r 's/(\w|\^)+\^(\w|\^)+/\\(&\\)/g' <<< "$myvar" \(a^2\) This is not \(x^2\) good without \(y^2x^3\) extra latex brackets \(b^5\) 和其他无意义的表达。

为了使这更便携,请说POSIX sed兼容,我们必须坚持基本的正则表达式,不能使用交替或^^^

+

最后一个表达式在匹配的开头和结尾需要sed 's/[[:alnum:]][[:alnum:]^]*\^[[:alnum:]^]*[[:alnum:]]/\\(&\\)/g' <<< "$myvar" 以外的字符,因此^可以正常,但x^2^2和{{ 1}}不会匹配。

替换中的2^代表完整匹配,^^^必须转义才会显示在结果中。