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

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

新規登録して質問してみよう
ただいま回答率
85.37%
sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

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

Q&A

解決済

1回答

1379閲覧

sedによる書き換えがうまくできない

trafalbad

総合スコア303

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

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

0グッド

0クリップ

投稿2021/07/21 23:27

編集2021/07/21 23:52

前提・実現したいこと

以下のようにyolov4-tiny.cfgをsedで書き換えたいです。
書き換えたい部分はfiltersclassesです。
変数を使用したいのですが、

1.以下の「書き換え後」のように、変数そのもので書き換えられてしまします。

2.下の「書き換えたい値」のように書き換えたいです

方法があったらご教授お願いします

書き換えのsedコマンド(sed.sh)

zsh

1# /bin/sh 2CLAESES=3 3FIL=(CLAESES+5)*3 4mv yolov4-tiny.cfg yolov4-tiny.cfg.bak 5cat yolov4-tiny.cfg.bak | sed -e 's/filters=255/filters=${FIL}/g' -e 's/classes=80/classes=${CLAESES}/g' > yolov4-tiny.cfg 6rm *bak 7

書き換える前の部分

zsh

1filters=255 2activation=linear 3 4[yolo] 5mask = 1,2,3 6anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 7classes=80

書き換え後

zsh

1filters=${FIL} 2activation=linear 3 4[yolo] 5mask = 1,2,3 6anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 7classes=${CLAESES}

書き換えたい値

zsh

1filters=24 2activation=linear 3 4[yolo] 5mask = 1,2,3 6anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 7classes=3

###追記
ダブルクオーテーションで囲んだら以下のようにFILが上手く計算結果を反映してくれません。
どうしたらFILの変数も「書き換えたい値」のように書き換えることが可能でしょうか?
訂正したcfg.sh

zsh

1# /bin/sh 2CLAESES=3 3FIL=(${CLAESES}+5)*3 4mv yolov4-tiny.cfg yolov4-tiny.cfg.bak 5cat yolov4-tiny.cfg.bak | sed -e "s/filters=255/filters=${FIL}/g" -e "s/classes=80/classes=${CLAESES}/g" > yolov4-tiny.cfg 6rm *bak

実行結果

zsh

1filters=(3+5)*3 2activation=linear 3 4[yolo] 5mask = 1,2,3 6anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 7classes=3

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

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

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

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

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

guest

回答1

0

ベストアンサー

FIL=(CLAESES+5)*3

計算結果を代入するのなら $(( )) で囲んでください。
FIL=$(( (CLAESES+5)*3 ))

cat yolov4-tiny.cfg.bak | sed -e 's/filters=255/filters=${FIL}/g' -e 's/classes=80/classes=${CLAESES}/g'

シングルクォートは変数展開されませんのでダブルクォートで囲んでください。

[追記]
修正後

zsh

1#!/bin/zsh 2CLAESES=3 3FIL=$(( (CLAESES+5)*3 )) 4mv yolov4-tiny.cfg yolov4-tiny.cfg.bak 5cat yolov4-tiny.cfg.bak | sed -e "s/filters=255/filters=${FIL}/g" -e "s/classes=80/classes=${CLAESES}/g" > yolov4-tiny.cfg 6rm *bak

投稿2021/07/21 23:31

編集2021/07/22 00:11
sigsegv

総合スコア895

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

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

trafalbad

2021/07/21 23:42

ダブルクオーテーションで囲んだら、追記した部分のように、FILが上手く計算結果を反映してくれません。 どうしたらFILの変数も「書き換えたい値」のように書き換えることが可能でしょうか?
trafalbad

2021/07/21 23:53

訂正しました。FILの計算結果ではなく計算式のまま置換されてしまいます。変数処理はきちんとされています
sigsegv

2021/07/22 00:13

回答に書いた内容を反映したシェスクリプトを回答に追記しました。
trafalbad

2021/07/22 00:29

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問