CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさんこんにちは。株式会社パイプラインの濱田です。前回はリダイレクトとパイプラインの活用について取り上げましたが、今回はもう一歩すすんだ応用、ヒアドキュメントによるファイル出力とsedコマンドによるテキスト置換について取り上げます。
bashにおけるヒアドキュメントは、主に1行もしくは複数行の文字列を標準入力から取り込んで出力する目的で利用されます。下記例では、区切り文字 EOL までの複数行テキストをcatコマンドに取り込んで標準出力へ出力しています。入力するコマンドは以下の通りです。
HANDLENAME=nullpopopo
cat << _EOL_
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_
上記のように入力したコマンドは以下のように出力されます。
これをファイルへ出力するには、以下のようにパイプラインでteeコマンドに渡してあげるか、ファイルへリダイレクトします。最後の区切り文字の後ではなく、区切り文字を指定した直後、テキスト内の本文より手前にファイル出力を行う記述をする、という点に気をつけてください。
HANDLENAME=nullpopopo
cat << _EOL_ | tee ${HOME}/${HANDLENAME}.txt
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_
出力されたテキストファイルを開いてみましょう。
このようにヒアドキュメントを利用することで、シェルスクリプトそのものを自動生成することも可能になります。 先ほどはヒアドキュメント内で変数を展開しましたが、変数そのものをヒアドキュメント出力するには、以下のように区切り文字をシングルクォーテーションで囲います。
HANDLENAME=nullpopopo
cat << '_EOL_'
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_
以下出力結果の赤枠のように、変数が展開されず変数そのものが出力されていることがわかります。
1つのテキストファイル中で変数そのものと変数の展開結果を同時に出力したい場合は、区切り文字をクォーテーションで囲まず、該当する部分の変数記号「$」をエスケープするとよいでしょう。
HANDLENAME=nullpopopo
cat << _EOL_
echo Linux
echo \${HANDLENAME}
echo ${HANDLENAME}
echo Shell Script
_EOL_
以下のように、変数記号をエスケープした行は変数が展開されずに出力されています。
シェルからテキストエディタを使わず標準出力をテキストに書き出せるので、シェルスクリプトによる無人運転で重宝するでしょう。
テキスト置換でよく使用されるsedコマンドですが、-iオプションを使うことで対象のファイルを上書きすることができます。A.txtの中のhamadaという文字列すべてをnullpopopoに置換したい場合、以下のように実行します。
sed -i "s/hamada/nullpopopo/g" A.txt
しかし、いきなり上書きせずにバックアップを取った上でファイルを直接置換したいという場合もあるでしょう。事前にcpコマンドを実行してもよいですが、A.txt を A.txt.BACKUP といったようにバックアップしつつ上書き置換することもできます。この場合、以下のように実行します。
sed -i.BACKUP "s/hamada/nullpopopo/g" A.txt
sedコマンドの-iオプションを用いることで、テキストエディタを開いてシェルを奪われることなくファイル内のテキストを置換できること、また、中間ファイルを生成したりすることなくファイルを上書きできること、バックアップファイルも採取できることがわかりました。
ヒアドキュメントとsedを使いこなすことにより、より少ないコードで自動的に成果を大量生産することが可能であることがおわかりいただけたかと思います。
CTC教育サービスではLinuxをはじめ多数の研修コースが用意されています。ご自身の興味や業務の必要性にあったコースを受講してみてはいかがでしょうか。
https://www.school.ctc-g.co.jp/category/
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes