IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

はじめてのLinux

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第8回 Linuxのファイルとディレクトリ基本 (5) バッチ処理に役立つヒアドキュメントとsedの応用 (濱田康貴) 2022年4月

みなさんこんにちは。株式会社パイプラインの濱田です。前回はリダイレクトとパイプラインの活用について取り上げましたが、今回はもう一歩すすんだ応用、ヒアドキュメントによるファイル出力とsedコマンドによるテキスト置換について取り上げます。

ヒアドキュメントによるテキスト出力を行う

bashにおけるヒアドキュメントは、主に1行もしくは複数行の文字列を標準入力から取り込んで出力する目的で利用されます。下記例では、区切り文字 EOL までの複数行テキストをcatコマンドに取り込んで標準出力へ出力しています。入力するコマンドは以下の通りです。

HANDLENAME=nullpopopo
cat << _EOL_
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_

  上記のように入力したコマンドは以下のように出力されます。

fig01

これをファイルへ出力するには、以下のようにパイプラインでteeコマンドに渡してあげるか、ファイルへリダイレクトします。最後の区切り文字の後ではなく、区切り文字を指定した直後、テキスト内の本文より手前にファイル出力を行う記述をする、という点に気をつけてください。

HANDLENAME=nullpopopo
cat << _EOL_ | tee ${HOME}/${HANDLENAME}.txt
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_

  出力されたテキストファイルを開いてみましょう。

fig02

このようにヒアドキュメントを利用することで、シェルスクリプトそのものを自動生成することも可能になります。 先ほどはヒアドキュメント内で変数を展開しましたが、変数そのものをヒアドキュメント出力するには、以下のように区切り文字をシングルクォーテーションで囲います。

HANDLENAME=nullpopopo
cat << '_EOL_'
echo Linux
echo ${HANDLENAME}
echo Shell Script
_EOL_

以下出力結果の赤枠のように、変数が展開されず変数そのものが出力されていることがわかります。

fig03

1つのテキストファイル中で変数そのものと変数の展開結果を同時に出力したい場合は、区切り文字をクォーテーションで囲まず、該当する部分の変数記号「$」をエスケープするとよいでしょう。

HANDLENAME=nullpopopo
cat << _EOL_
echo Linux
echo \${HANDLENAME}
echo ${HANDLENAME}
echo Shell Script
_EOL_

以下のように、変数記号をエスケープした行は変数が展開されずに出力されています。

fig04

シェルからテキストエディタを使わず標準出力をテキストに書き出せるので、シェルスクリプトによる無人運転で重宝するでしょう。  

sedの -i オプションでテキストの直接置換を行う

テキスト置換でよく使用される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