ファイル内の特定の文字列を置き換える予定なので、sed を使用しています。
文字列を置き換えたいのですが、代わりに sed で文字列を読み取り、文字列の途中にテキストを追加します。
例:
string in myfile : user=blabla
string that I want to obtain: user=bob
そこで、sedをこのように実行して、「user=」文字列を検索し、「user=bob」に置き換えます。
sed -i 's/user=*/user=bob/' myfile
私が得たのは
user=bobblabla
基本的に、sed はその部分だけを置き換えたいと考えていますが、私は文字列全体を新しい文字列に置き換えたいのです。 * は sed にその後に続くものを考慮するように指示すると思いましたが、うまくいきませんでした。
「blabla」が何になるかわからないので、sed コマンドに入力できません。sed に「user=」で始まる文字列を検索し、文字列全体を新しい文字列に置き換えるように指示するにはどうすればよいでしょうか。
答え1
シェル パターンと正規表現を混同しているようです。シェル パターンでは、 は*
任意の文字の 0 回以上を意味します。正規表現では、sed
パターンで が期待されるのは であり、*
前のアトムの 0 回以上を意味します。あなたの例では、そのアトムは です=
。つまり、は の後に 0 回以上続くsed
を検索し、一致する文字列を に置き換えます。必要なパターンは で、その後に任意の文字 ( ) が 0 回以上続くため、コマンドは次のようになります。user
=
user=bob
user=.*
user=
.
sed
sed -i 's/user=.*/user=bob/' myfile
答え2
GaryJohn が言ったように、正規表現が間違っています。(* -> .*)
しかし、ついでにもう少し踏み込んでみましょう... あなたのファイルが実際にどのようなものかはわかりませんが、練習のために、検索/置換操作をもう少し安全にすることを検討します。
次のようなファイルに対して実行したいとします。
user=john
superuser=jimmy # don't want to change this line!
user=L33t_us3rn4m3 # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello
現在の sed 構文では、これはまったくうまくいきません。もう少し具体的にするには、次を試してください。
sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile
この意志:
- 行が実際に「user」(^)で始まる場合にのみトリガーされます。
- 「user=」は0文字以上の文字、数字、アンダースコアで構成されている場合にのみ変更してください。
- ユーザー名の後ろにあるすべてのもの(つまり私の例ではコメント)をそのまま残します
これは、ユーザー名を変更したい場合にいつでもどこでも機能する、非常に安全な方法ではありません。もちろん、これは、構成ファイルの設定方法と、想定される状況によって異なります。しかし、私の回答は、少し「考えるための材料」を提供することを目的としています。なぜなら、多数のユーザー名が想定されるほど大きな構成ファイル (数) がある場合、手動でこれを行うことは望ましくないため、盲目的に「user=.*」を置き換えることは危険である可能性があるからです。この種の操作を磨くのに少し時間を費やす必要があるかもしれません :)
幸運を。