使用sed和regex来查找和替换字符串

时间:2016-04-23 08:37:57

标签: regex bash shell vim sed

所以我在config.fishinit.vim中有以下字符串:

鱼:eval sh ~/.config/fish/colors/base16-monokai.dark.sh
Vim:colorscheme base16-monokai
Vim:let g:airline_theme='base16_monokai'

我有以下shell脚本:

#!/bin/sh

theme=$1
background=$2

if [ -z '$theme' ]; then

    echo "Please provide a theme name."

else

    if [ -z '$background' ]; then
        $background = 'dark'
    fi

    base16-builder -s $theme -t vim -b $background > ~/.config/nvim/colors/base16-$theme.vim &&
    base16-builder -s $theme -t shell -b $background > ~/.config/fish/colors/base16-$theme.$background.sh &&
    base16-builder -s $theme -t vim-airline -b $background > ~/.vim/plugged/vim-airline-themes/autoload/airline/themes/base16_$theme.vim

    sed -i -e 's/foo/eval sh ~/.config/fish/colors/base16-$theme.$background.sh/g' ~/Developer/dotfiles/config.fish
    sed -i -e 's/foo/colorscheme base16-$theme/g' ~/Developer/dotfiles/init.vim
    sed -i -e 's/foo/let g:airline_theme='base16_$theme'/g' ~/Developer/dotfiles/init.vim


fi

基本上,我们的想法是脚本会生成使用此builder传递的主题。

我试过引用这个documentation,但我对正则表达式并不熟练,所以如果有人能帮我一把,我会很感激。

我需要发生的是,一旦生成脚本sed将查找上述字符串并用新生成的主题替换主题。

4 个答案:

答案 0 :(得分:1)

试试这个:

[a-zA-Z]

在第二个sed命令中假设主题是一个字母数字字符串。如果没有,您可以填写字符范围:[a-zA-Z0-9]以及其他字符(例如ControlGroup)。

答案 1 :(得分:1)

您可以使用以下语法替换sed中的内容:sed "s#regex#replacement#g"。由于您的字符串中包含/',因此最简单的方法是不需要将其删除。

有些字符需要转义才能制作正则表达式。需要使用.转义$\。替换字符串中的$也需要进行转义。

如果要从匹配中捕获某个部分,最简单的方法是使用char类。例如,如果您希望替换为eval sh ~/\.config/fish/colors/base16-([^.]+)\.dark\.shairline_theme='$1_base16_\$theme'将是正则表达式。在这种情况下,替换中的$ 1是正则表达式中捕获的东西。

  • [^.]+将捕获截至下一个.
  • 的所有内容

我希望这有助于您更好地了解正则表达式!这应该足够详细,告诉你如何编写自己的。

答案 2 :(得分:0)

您需要使用双引号进行参数扩展而不是单引号 您需要转义单引号:'hello'\''world'

我会为你制作一行,并将其作为练习来修复其他行

sed -i -e 's~\(let g:airline_theme='\''\)[^'\'']*\('\'\)'~base16_'"$theme"~' ~/Developer/dotfiles/init.vim

答案 3 :(得分:0)

sed表达式字符串中s之后的第一个字符用作模式分隔符,因此首先放置/指定/作为分隔符。

另外使用单引号告诉shell不要扩展任何变量,你将要使用双引号。

尝试类似

的内容
sed -i -e "s#foo#eval sh ~/.config/fish/colors/base16-$theme.$background.sh#g" ~/Developer/dotfiles/config.fish

正如您现在评论的那样,您需要找到上一个主题字符串而不是foo

sed -i -e "s#eval sh \~/\.config/fish/colors/base16-.*?\..*?\.sh#eval sh ~/.config/fish/colors/base16-$theme.$background.sh#g" ~/Developer/dotfiles/config.fish
相关问题