2016-04-23 31 views
0

を見つけて交換する正規表現でsedを使用:だから私は私の<code>config.fish</code>に次の文字列を持っている、と<code>init.vim</code>文字列

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

そして、私が持っています次のシェルスクリプト:

#!/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を生成したら、私が起こるに必要なもの

です。

答えて

1

の以前のテーマの文字列を検索する必要があるとコメントしてきたように

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

のようなものを試してみてくださいと仮定

sed -i "s|\(eval sh ~/\.config/fish/colors/base16-\)\([^.]*\)\.\([^.]*\)\\(.*\)|\1$theme.$background\4| 
" ~/Developer/dotfiles/config.fish 
sed -i "s/\(base16\)\([-_]\)\([a-zA-Z]*\)/\1\2$theme/g" ~/Developer/dotfiles/init.vim 

2番目のsedコマンドでは、テーマは英数字の文字列です。そうでない場合は、追加の文字(例:[a-zA-Z0-9])を含む[a-zA-Z]の文字範囲を入力することができます。 sed "s#regex#replacement#g"

+0

ありがとうございました。 –

0

一重引用符ではなくパラメータ拡張に二重引用符を使用する必要があります。
あなたは単一引用符エスケープする必要があります:私はあなたのための1行を作成し、他の線

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

こんにちはありがとう@andlrc、私はそれを感謝しますが、問題は正規表現でもっと私は以前の 'eval sh〜/ .config/fish/colors/base16-monokai.dark.sh'を見つけ出す必要がありますテーマ(monokai)、つまり 'eval sh〜/ .config/fish/colors/base16 - {*}。{*}。sh'を知っていますが、構文を理解できませんでした。 –

0

sedの式のs後の最初の文字を修正するための練習としてそれを残します'hello'\''world'

を文字列がパターンセパレータとして使用されるので、最初に/を/をセパレータとして指定します。さらに、単一引用符を使用して

は、任意の変数を展開していないシェルを伝え、あなたの代わりに二重引用符を使用したいしようとしています。

あなたは今、あなたはこれを試してみてください代わりに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 
1

あなたはこの構文を使用して、sedの中で何かを置き換えることができます。文字列に/'があるため、エスケープする必要はありません。

正規表現を作るためにエスケープする必要があるいくつかの文字があります。 .$\でエスケープする必要があります。置換文字列の$もエスケープする必要があります。

あなたは試合から特定の部分をキャプチャしたい場合、それは、charクラスを使用するのが最も簡単です。たとえば、eval sh ~/\.config/fish/colors/base16-([^.]+)\.dark\.shは、置き換え先をairline_theme='$1_base16_\$theme'にする場合に使用する正規表現になります。その場合、置き換えの$ 1は正規表現で捕捉されたものです。

  • [^.]+は、私は、これはあなたがより良い正規表現を理解するのに役立ちます願ってい次.

にすべてをキャプチャします!これはあなた自身の書き方を示すのに十分なほど詳細に記述されるべきです。

関連する問題