2011-12-29 3 views
2

sedを使用して開始文字と終了文字の間にある文字を取得しようとしています。これらの開閉文字は中括弧であってもよい。 {と}などです。私の具体的なケースでは、開始文字は=で、終了文字はラインの終わりです。Sedを使用して開始文字と終了文字の間のすべての文字を取得する

PHPでは、私は通常私のために働いた正規表現を持っていました:([^\^]*?)。しかし、sedがPOSIX-BREフレーバーを使用しているので、これはうまくいくとは思わない。

正規表現を使用している文字列は、password=mailPASSWORDのようになります。 mailPASSWORDには、通常のアルファベット文字と特殊文字を含めることができます。

私はmailPASSWORDを置き換えて自分のパスワードを入れたいと思います。

私は助けていただきありがとうございます。事前

EDIT

おかげsedのために、他の選択肢を見た後、私はperlが実際にこの種のもののためにはるかに優れたツールであることが分かりました。そして、私の正規表現の知識はかなりのperlベースであるため、より良い方法に見えます。ここで

は、私は同じ問題を解決する方法は次のとおりです。

perl -p -i -e "s/password *= *[^\n]*/password=mypassword/" /myfile 

私はラインでスタッフラインをやっているので、それだけでスクリプトに非常に簡単なものを作ります。あなたの特定のケースについては

答えて

2

:終了デリミタは文字がある場合は、より一般的なケースでは

sed -i -r -e 's/password *= *[^\t ]*/password=mypassword/' /myfile 

、のはxを言わせて、あなたはこれをシミュレート:これで

.*?x 

[^x]*x 

複数文字の区切り文字の場合、複雑になりますが、それはtです彼は基本的なアイデア:貪欲でないマッチングの代わりに、すべてに一致するパターンを作成しますが、末尾の区切り文字はです。sed

+0

終了区切り記号は新しい行またはスペースまたはタブです。 PHPでは、この 'password [] * = [] *([^ \ ^] *?)[\ n \ t] *'のようなことをします。私がPOSIX-BREのやり方で同じことを達成する方法がわからないのですか? –

+0

@ChuckUgwuhあなたの質問は、 "閉じた文字は行の終わりです"と言います。終了区切り文字であるタブやスペースについて何も言及していませんでした。私の答えへの更新を見てください。 sedは行ベースなので '\ n'を除外する必要はないので、改行は効果的に除外されます。 –

+0

@LaurenceGonzalvesありがとうございました。これは私のために働く。 –

2

awk

[jaypal:~] awk -F"=" '{$2="mypassword";print $1"="$2}' <<< password=mailPASSWORD 
password=mypassword 
+1

+1 'sed'の場合は、\ 1逆参照に' = 'を含めて、再度置換テキストに明示的に入力する必要はありません – SiegeX

+0

ありがとう@SiegeX、私は同意します。答えを更新しました。 :) –

+0

ありがとう。 ':alnum:'ではない数字や文字、つまり '[\ w]'は同等ですか? –

0

[jaypal:~] sed 's/\(.*[^=]=\)[[:alnum:]]\+/\1mypassword/' <<< password=mailPASSWORD 
password=mypassword 

これはあなたのために働くかもしれない:

echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' | 
sed 's/^\(.*\<password\s*=\s*\)\S*/\1mypassword/' 
someotherpassword=xxx password = mypassword another=yyy 

あなたがワットない場合その後、=記号のいずれかの側、ホワイトスペースを保持するためにアリ:

echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' | 
sed 's/^\(.*\<password\)\s*=\s*\S*/\1=mypassword/' 
someotherpassword=xxx password=mypassword another=yyy 

ラインのみを含む場合、1つのパスワードの割り当て:

echo 'password = mailPASSWORD_with_an_=_sign' | 
sed 's/\(=\s*\)\S*/\1mypassword/' 
password = mypassword 

やホワイトスペースなし:

echo 'password = mailPASSWORD_with_an_=_sign' | 
sed 's/\s*=.*/=mypassword/' 
password=mypassword 
関連する問題