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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sed

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

Q&A

解決済

2回答

1236閲覧

複数sedコマンドの終了結果

mugichon

総合スコア61

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sed

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

0グッド

0クリップ

投稿2020/01/31 05:21

以下のようなソースコードがある場合、sedコマンドをパイプでつないでいるせいか、
1つ目のsedでsedのセパレータ("/")と置換文字列が同じでエラーが発生していても、後のsedが正常
終了する為、障害を検知出来ません。
順番を入れ替えれば良いというご指摘も頂くかも知れませんが、以下はサンプルで、
順番を入れ替えたとしても、最後のsedが障害となるかは分かりません。
(結局最後のsed以外がエラーになれば検知出来ないと思います)

shell

1test1="kono url ha ok desu." 2test2="http://www.test.co.jp" 3test3=`echo $test1 | sed -e "s/url/$test2/g" | sed -e "s/kono/xxx/g"` 4if [ $? -ne 0 ]; then 5 echo 不正な文字で置換しようとした 6 exit 1 7fi

そこで、以下のような方法も考えてみましたが毎回sedする度にechoすると、パイプで繋げるより負荷が掛かりそうな気がしています。(毎度ifもどうかと…)

shell

1test1="kono url ha ok desu." 2test2="http://www.test.co.jp" 3test3=`echo $test1 | sed -e "s/url/$test2/g"` 4if [ $? -ne 0 ]; then 5 echo 不正な文字で置換しようとした 6 exit 1 7fi 8test4=`echo $test3 | sed -e "s/kono/xxx/g"` 9if [ $? -ne 0 ]; then 10 echo 不正な文字で置換しようとした 11 exit 1 12fi

そこで、もっときれいで分かりやすく、コストが掛からない方法はないでしょうか??

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

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

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

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

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

nanami12

2020/01/31 05:30

>sedのセパレータ("/")と置換文字列が同じでエラーが発生していても、 sedの区切り文字は/じゃなくても動作しますよ。例えば#
mugichon

2020/01/31 05:43

回答ありがとうございます。 確かにそうなのですが、その文字が何が入ってくるか分からない状態なのです。 #をセパレータにしても#が入ってきたらOUTですし… そのエラーが発生した時に検知出来ない事が問題なので、検知できるようにしたいのが意図です。
guest

回答2

0

シェルが bash ならば、pipefail オプションを設定すると、途中のエラーも拾うことができます。

bash

1$ set -o pipefail 2$ true | false | true 3$ echo $? 41

また、各コマンドの終了ステータスは配列変数 PIPESTATUS で確認することができます。

bash

1$ true | false | true 2$ echo ${PIPESTATUS[@]} 30 1 0

投稿2020/01/31 06:52

TaichiYanagiya

総合スコア12146

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

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

0

ベストアンサー

順番を入れ替えたとしても、最後のsedが障害となるかは分かりません。

ひとつのsedコマンドで実行してみてはどうでしょうか?

sh

1test3=$( 2 echo $test1 | \ 3 sed -e "s/url/$test2/g" \ 4 -e "s/kono/xxx/g" \ 5 -e "s!aaa/bbb!xxx/yyy!g" 6)

投稿2020/02/01 14:29

編集2020/02/08 08:01
shiketa

総合スコア3971

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

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

mugichon

2020/02/03 02:01

ご回答ありがとうございます。 一つのsedコマンドで複数実行出来る事は初めてしりました。 試してみて結果ご連絡します!
mugichon

2020/02/07 23:51

確認しました!問題なく動きました。 ありがとうございます!助かりましたっ!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問