2013-04-25 4 views
7

私はzshとemacsのキーバインディングを使用します。ある時間、同じコマンドを異なる入力で実行する必要があります。入力には通常、共通部分文字列があります。前のコマンドの部分を他の文字列に置き換える簡単な方法はありますか?たとえば、前のコマンドは次のとおりです。はzshコマンドラインの文字列を置き換えます

cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt 

にはどうすれば簡単に「CHR 3」と「にChR2」を置き換えることができますか?

他の異なる文字列にコマンドで、いくつかの異なった部分文字列を置き換えるために、どのように質問に拡張:

交換方法
cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered 

、「chrX」、「ChR2を」でのが、「CHR 1」を言わせてwtih 'chrY'、 'chr3'と 'chrZ'

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

$ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/ 

これが最後のコマンドが入力された変更されます:あなたは直接のために尋ねacomplishする

答えて

17

また、これは最初の出現を変更

~ % cd /tmp 
/tmp % ^tmp^etc # <-- changes tmp for etc 
/tmp % cd /etc 
/etc % 

!!:s^old^new^よりもはるかに高速)^old^new速いヒストリ置換を行うことができます。さらに必要な場合は、履歴修飾子のいずれかを使用します。例:グローバルな変更:

/etc % echo tmp tmp tmp 
tmp tmp tmp 
/etc % ^tmp^etc 
/etc % echo etc tmp tmp # <--- only the first tmp got changed 
etc tmp tmp 
/etc % ^tmp^etc^:G  # <-- 'global' 

PS:これを記述したセクションを見つけること^foo^barためzshexpnマニュアルを検索します。少し下にスクロールすると(マニュアルに)、「履歴拡張修飾子」リストが表示されます。

PS:複数の置換のために、実行します。あなたの答えのための^old1^new1^:s^old2^new2^など

6

。グローバル置換を実行するには、:gs/a/b/を使用します。

例:

$ man zshall 
$ !!:gs/man/less/:gs/zshall/.history/<TAB> 
$ less .history 

もっと読むman zshexpn中 - ZSH拡大と置換。

+0

感謝を。フランシスコは2つの方法を提供しているので、私は彼とあなたのアップアップを受け入れました。 – Rainfield

+0

AFAIU '^ old^new ^'は一度に複数の置換を要求しました。 –

+1

'^ old^new ^'は '!!:s^foo^bar ^'と同義であることに注意してください。複数の置換を行う場合は、以前と同じように進めることができます。私は私の答えを更新します... – Francisco

関連する問題