echo ddayaynightday | sed 's/day//g'
sedの代替物は、再帰的に
それは、daynight
を終わることはありませんより多くの試合まで、代用にするとにかくはありますか?
echo ddayaynightday | sed 's/day//g'
sedの代替物は、再帰的に
それは、daynight
を終わることはありませんより多くの試合まで、代用にするとにかくはありますか?
私の好ましい形態、:
echo ddayaynightday | sed -e ':loop' -e 's/day//g' -e 't loop'
これはそれを作るために、複数の-eコマンドを使用していることを除いて、誰も他の人のと同じですこの3つの行にはt
コンストラクトが使用されます。これは「正常に置換した場合は分岐する」という意味です。 bashの持つ
コマンド行に複数のスクリプト行を入力する方法を知っておくと良いでしょう。動作しません。無条件ジャンプとのパターンマッチではなく、私にとってより明確な 't'条件付きジャンプのためにあなたの答えも好きです。 –
ありがとう:)私はこれが良いと思う、いくつかの拡張正規品を使用してより良い方法があるかどうかわからない.. – w00d
g
フラグが故意ストリングの置換部分に対して再一致していません。あなたがする必要があることは、少し違うことです。これを試してください:
echo ddayaynightday | sed $':begin\n/day/{ s///; bbegin\n}'
BSD Sedの気まぐれのために、埋め込み改行が必要です。あなたはGNU sedのを使用している場合は、
sed ':begin;/day/{ s///; bbegin }'
shのようなシェルでは、引用符付きの文字列の中にリテラル改行を挿入することもできます。一方、私は '$ '...エスケープ文字列...'を見つけました。このような短いスクリプトのためにもっときれいになります。非常に長いスクリプトの場合、 '-f file'を使用するほうがおそらく良いでしょう。この特定のケースでは、複数の '-e'コマンドも機能します。 – torek
@torek:複数の '-e'コマンドに関する良い点。私は個人的に引用符で囲まれた文字列に改行を埋め込むことが嫌いです。通常は読みにくく、他の人とコマンドを共有するのがずっと難しくなります(コマンドは一般的に1行にあると予想されるため)。 –
ありがとう、あなたの第2は私のosxで動作しません、それは単に入力を印刷します – w00d
次作品で逃げるすることができる場合があります
$ 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'
}
次の代わりに使用します
コマンドの一部が実行されないと、パターンスペースの現在の内容が出力され、次の行が読み込まれます。
:その長さになるまで
str=ddayaynightday
while true; do tmp=${str//day/}; [[ $tmp = $str ]] && break; str=$tmp; done
echo $str
を繰り返して、変更を停止します。わからない、どのようにシェルでそれを行う。 – kirilloid