私がやろうとしているのは、次のことです: ファイルがあり、その中に行があります (必ず 100% 存在します):
name_of_the_value=xxx
価値はどこにあるのか数値そして 未知デバイスごとに異なるため、私では... 何らかの方法で値を取得しxxx
、ユーザーが指定した別の値に置き換える必要がありますTextField
(これには Java を使用しています。これは Android アプリケーション用ですが、いずれにしても純粋なシェル スクリプトです)。
有効です:
- 行全体を見つけて削除し、完全な行に置き換えます。例: 削除し
name_of_the_value=xxx
て置き換えます。name_of_the_value=user_value
xxx
(値)部分のみを置換する- 一致する既存の行を「#」でコメントし、ファイルの最後に完全な行を記述します。
しかし、値がわからない場合はecho
、sed
や をどのように使用すればよいのでしょうか?awk
答え1
user_value の部分が常に 3 文字であると仮定すると、次のように実行できます。
sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"
または、その行の後ろに何もないことが確実な場合は、次のようにも使用できます。
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"
この正規表現が正しいといいのですが、私はこの分野のプロではありません。したがって、値は常に 3 文字で、16 進数形式が最適です。100 未満の場合は 10 進数が常に 3 文字になるとは限らないためです。2 番目のケースは、数値が 100 未満でも機能するはずですが、そのname_of_the_value=user_value
部分全体が独自の行にあると想定しています。ターミナルでこれをテストすると、2 番目のケースの出力は次のようになります。
video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video
もちろん、出力をファイルにパイプで戻すか、一時ファイルを使用してスワップする必要があります。次のように使用できます。
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file
Sed はファイルを書き込むのではなく、読み取り時にのみ出力を変更します。sponge は完了するまで出力を保存し、変更を書き戻します。
スポンジを使用したくない場合、または使用できない場合は、2 番目のファイルに書き込み、次のコマンド チェーンのように切り替えます。
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file
@kos がコメントで指摘したように、コマンド-i
のフラグを使用してsed
、一時ファイルを使用せずに入力ファイルに書き戻すこともできますsponge
。
sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file