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

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

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

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

sed

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

Q&A

解決済

3回答

1238閲覧

bashの実行とsedの実行についてです。

enpdot

総合スコア7

bash

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

sed

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

0グッド

0クリップ

投稿2018/03/29 08:59

前提・実現したいこと

シェルスクリプトとsedを勉強しています。
環境はcentos6.5です。

ファイル内に指定の文字列があれば、何もしない、無ければ追加する

というのを

bash

1sed -i -e '/^LC_CTYPE=/d' /etc/sysconfig/i18n 2sed -i -e '$ a LC_CTYPE="ja_JP.UTF-8"' /etc/sysconfig/i18n

こう書いてみました。

具体的には(書いてる通りですが)、/etc/sysconfig/i18n というファイルに、LC_CTYPE="ja_JP.UTF-8" の1行を、上の指定通りにやりたいです。

これを ./command.sh で保存して、sudo ./command.sh として実行という風に考えているのですが、普通はどうやるものでしょうか?もしくは、皆さんはどのようにやりますか?

気になる点

  • sed でやるなら1行にならないものか?2行になってるのが気になる。実行の都度削除しているのが変に思う
  • sudo 実行に関して、sudo ./command.sh と実行するのは、/etc/sysconfig/i18n を触るのでしょうがない(?)ものですか?今ひとつわかってなくてすみません。
  • シェルスクリプトにするなら、if 文を使うべきなのですか?

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

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

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

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

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

guest

回答3

0

ファイルを更新するのはsedではできません。
ファイルをsedで書き換えたものを別ファイルに入れて、あとでそのファイルを元のファイルに書き戻すことはできます。
ただし今回は「・・・なら何もしない」という条件がついているので、sedがファイルを変更したかどうかのチェックも必要です。

そういうわけで、「入力データをそのまま出力する。入力にある行がないときのみファイル末尾にある行を追加」を1本のsedコマンドでできますが、/etc/sysconfig/i18nを触るのが目的でしたら悪手ですのでお勧めしません。

すでに回答されているようにgrepとecho>>でやるのがベストでしょう。

投稿2018/03/29 13:19

a_saitoh

総合スコア702

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

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

KojiDoi

2018/03/29 13:27

-i 付ければできますよ。
a_saitoh

2018/03/29 14:22 編集

POSIXの規定にない独自拡張ですね。今回の質問者はCentOSなのでGNU sedが入ってる、ので、-iは使えますね。
enpdot

2018/03/29 17:48

@a_saitoh さん ありがとうございます!勉強させていただきます!
guest

0

sed でやるなら1行にならないものか?2行になってるのが気になる。実行の都度削除しているのが変に思う

sed -i -e '/^LC_CTYPE=/d; $ a LC_CTYPE="ja_JP.UTF-8"' /etc/sysconfig/i18n

投稿2018/03/29 09:42

KojiDoi

総合スコア13671

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

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

enpdot

2018/03/29 17:48

@KojiDoi さん ありがとうございます!これもやりたかったことです!
guest

0

ベストアンサー

要件と例とで仕様が微妙に違うようにも思いますが、要件のほうに合わせるなら私の場合はこう書きます。

if ! grep -q '^LC_CTYPE=' /etc/sysconfig/i18n; then echo 'LC_CTYPE="ja_JP.UTF-8"' >> /etc/sysconfig/i18n fi

また、sudoは必要だと思います。

投稿2018/03/29 09:21

emasaka

総合スコア524

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

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

enpdot

2018/03/29 17:47

@emasaka さん ありがとうございます!勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問