質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

4回答

1435閲覧

特定条件の文字列を置換するシェルを書きたい

syoshinshaboy

総合スコア1

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2021/12/03 02:10

編集2021/12/03 02:11

<やりたいこと>
hoge.txt内の先頭がAPPLE_JUICEから始まる行の=以降を0に置換するシェルを作成

置換前hoge.txt
APPLE_JUICE=100
apple_juice=200
LEMON_JUICE=300

置換後hoge.txt
APPLE_JUICE=0
apple_juice=200
LEMON_JUICE=300

↓途中まで作成してみたhoge.sh↓
!/bin/sh

pattern='^APPLE_JUICE.*$'
while read line; do
if [[ $line =~ $pattern ]]; then
置換する処理をしたい
fi
done

while readコマンドで1行ずつ処理をしようとしましたが
=以降の文字列を置換する方法(正規表現含め)がわからず
お知恵を拝借したいです。
※他にもっと簡単なやり方があればそちらも知りたいです。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

sh

1$ sed -E -e 's/^(APPLE_JUICE=)(.*)$/\10/' hoge.txt

追記

Awk の場合

sh

1$ awk -F= -vOFS== '/^APPLE_JUICE=/{$2=0}{print}' hoge.txt

投稿2021/12/03 02:29

編集2021/12/03 03:01
melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sh

1perl -p -i -e 's/^(APPLE_JUICE=).+$/${1}0/g' hoge.txt 2//調整版 3perl -p -i -e 's/^(APPLE_JUICE.*?=).+$/${1}0/g' hoge.txt

投稿2021/12/03 02:22

編集2021/12/03 02:54
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

単純にsedでやればいいのではないでしょうか?

sed -r 's/^(APPLE_JUICE.*)=.*$/\1=0/g'

(なお、入出力部分は適宜設定が必要です)

投稿2021/12/03 02:17

編集2021/12/03 02:31
maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syoshinshaboy

2021/12/03 02:25

ご回答ありがとうございます。 すいません、質問内容が言葉足らずでした・・・。 hoge.txtの中には APPLE_JUICE_hogehoge=500 など、APPLE_JUICEの後に文字列が入る行も想定しております。 なのでAPPLE_JUICEで始まる行の=以降のみを0に置換する形にしたいです。
maisumakun

2021/12/03 02:32 編集

そういう形に書き直してみました。 (例の中にも「APPLE_JUICE_hogehoge=500」などが入っていると、わかりやすいかと思います)
syoshinshaboy

2021/12/03 05:24

後学の為に教えていただきたいのですが、 -r で拡張正規表現を明示していると思うのですが、拡張正規表現に該当する箇所はどこになるのでしょうか。 また、\1=0のが表す内容も教えていただきたいです。(特に\1の部分) すいませんが、宜しくお願い致します。
maisumakun

2021/12/03 05:31 編集

> 拡張正規表現に該当する箇所はどこになるのでしょうか。 丸括弧によるキャプチャが、拡張なしでは(と書く必要があります。 > \1=0のが表す内容 \1は「マッチした部分の1つ目のカッコ」です。=0は、文字通り「=0」です。
syoshinshaboy

2021/12/03 08:25

ご丁寧にありがとうございました!
guest

0

先頭がAPPLE_JUICEから始まる行の=以降を0に置換するシェルを作成

そのままsedの命令に。

sh

1sed -i.bak '/^APPLE_JUICE/s/=.*/=0/' hoge.txt

投稿2021/12/03 10:20

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問