web-dev-qa-db-ja.com

sedを使用して文字列の一部を置き換える

ファイル内の特定の文字列を置き換えることを計画しています。 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コマンドに入れることはできません。 「user =」で始まる文字列を検索し、文字列全体を新しい文字列に置き換えるようにsedに指示するにはどうすればよいですか?

5
rataplan

シェルパターンを正規表現と混同しているようです。シェルパターンでは、*は0個以上の任意の文字を意味します。 sedがパターンで期待する正規表現では、*は前のアトムの0個以上を意味します。あなたの例では、atomは=です。したがって、seduserの後に0個以上の=を検索します一致する文字列をuser=bobに置き換えます。必要なパターンはuser=.*で、user=の後に任意の文字(.)がゼロ回以上続くことで、sedコマンド:

sed -i 's/user=.*/user=bob/' myfile
7
garyjohn

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」で始まるときにのみトリガーします(^)
  • 0以上の文字、数字、またはアンダースコアで構成される限り、「user =」のみを変更します
  • ユーザー名の後ろにすべてを残します(つまり、私の例のコメント)

これは、ユーザーの名前を変更する場所でいつでもどこでも機能する、非常に安全なものではありません。明らかに、それはあなたの設定ファイルがどのように設定されているか、そしてあなたが遭遇することを期待するものに依存します。しかし、私の答えは少し「考えるための食べ物」を与えることを意図しています。なぜなら、非常に多くのユーザー名がこれを手動で実行したくないと予想するのに十分な大きさの(多数の)設定ファイルが与えられると、盲目的に「user =。* "おそらく危険なようです。これらの種類の操作を磨くのに少し時間をかけることをお勧めします:)

幸運を。

2
SadBunny