2012-04-02 13 views
9

echo ddayaynightday | sed 's/day//g'sedの代替物は、再帰的に

それは、daynight

を終わることはありませんより多くの試合まで、代用にするとにかくはありますか?

+0

を繰り返して、変更を停止します。わからない、どのようにシェルでそれを行う。 – kirilloid

答えて

17

私の好ましい形態、:

echo ddayaynightday | sed -e ':loop' -e 's/day//g' -e 't loop' 

これはそれを作るために、複数の-eコマンドを使用していることを除いて、誰も他の人のと同じですこの3つの行にはtコンストラクトが使用されます。これは「正常に置換した場合は分岐する」という意味です。 bashの持つ

+1

コマンド行に複数のスクリプト行を入力する方法を知っておくと良いでしょう。動作しません。無条件ジャンプとのパターンマッチではなく、私にとってより明確な 't'条件付きジャンプのためにあなたの答えも好きです。 –

+0

ありがとう:)私はこれが良いと思う、いくつかの拡張正規品を使用してより良い方法があるかどうかわからない.. – w00d

3

gフラグが故意ストリングの置換部分に対して再一致していません。あなたがする必要があることは、少し違うことです。これを試してください:

echo ddayaynightday | sed $':begin\n/day/{ s///; bbegin\n}' 

BSD Sedの気まぐれのため​​に、埋め込み改行が必要です。あなたはGNU sedのを使用している場合は、

sed ':begin;/day/{ s///; bbegin }' 
+0

shのようなシェルでは、引用符付きの文字列の中にリテラル改行を挿入することもできます。一方、私は '$ '...エスケープ文字列...'を見つけました。このような短いスクリプトのためにもっときれいになります。非常に長いスクリプトの場合、 '-f file'を使用するほうがおそらく良いでしょう。この特定のケースでは、複数の '-e'コマンドも機能します。 – torek

+0

@torek:複数の '-e'コマンドに関する良い点。私は個人的に引用符で囲まれた文字列に改行を埋め込むことが嫌いです。通常は読みにくく、他の人とコマンドを共有するのがずっと難しくなります(コマンドは一般的に1行にあると予想されるため)。 –

+0

ありがとう、あなたの第2は私のosxで動作しません、それは単に入力を印刷します – w00d

1

次作品で逃げるすることができる場合があります

$ echo ddayaynightday | sed ':loop;/day/{s///g;b loop}' 
night 

お使いのシステムに応じて、;は、コマンドを区切るために動作しない場合がありますので、あなたのことができ

echo ddayaynightday | sed -e ':loop' -e '/day/{s///g 
               b loop}' 

説明:

:loop  # Create the label 'loop' 
/day/{  # if the pattern space matches 'day' 
    s///g  # remove all occurrence of 'day' from the pattern space 
    b loop # go back to the label 'loop' 
} 
次の代わりに使用します

コマンドの一部が実行されないと、パターンスペースの現在の内容が出力され、次の行が読み込まれます。

+0

きちんと、おい!321 – Almo

+0

これは私のためには機能しません。 'sed:1:":loop;/day/{s/day // g; b ... ":未使用ラベル 'loop;/day/{s/day // g; b loop} '' – Graham

+0

セミコロンはsedのいくつかのバージョンでのみ動作します。 – torek

0

[OK]を、ここに彼らがいる:bashでwhilestrlen。それらを使用して 一つは私のアイデアを実装することがあります。

Repeat until its length will stop changing.

「これ以上の試合までの代替」には、そのような正規表現を記述するためのフラグや方法を設定するどちらの方法があります。

5

これはあなたのために働くかもしれない。この場合の

echo ddayaynightday | sed ':a;s/day//g;ta' 
night 
+0

は私のosxでは動作しません – w00d

+0

複数の '-e'スイッチが必要なようです – potong

+0

OSX 10.6.8で動作しますか? – MASL

2

:その長さになるまで

str=ddayaynightday 
while true; do tmp=${str//day/}; [[ $tmp = $str ]] && break; str=$tmp; done 
echo $str