シェルスクリプトでの文字の解析 置き換え編

皆さんこんにちはmk-linux419です。
今回はシェルスクリプトで、文字の置き換えをするときに良く使用するものを紹介したいと思います。

スポンサーリンク

sed

文字列の操作を行うコマンドの代表格です。
文字の置き換え、行の削除、指定した行の取り出しといったことができます。
今回は文字の置き換えに焦点を当てていきます。
基本的な使い方は下記のとおりです。

sed "s/置き換え前/置き換え後/"

大抵の場合パイプを通して使います。

例1

echo "FAscodeNetwork" | sed "s/A/a/"
-> FascodeNetwork

“|” を使うことでsedに情報を渡すことができます。

例2

echo "FascodENEtwork" | sed "s/E/e/"
-> FascodeNEtwork

あれ? 最後の”E”が置き換えられていません・・・
実はsedでは複数の置き換えをするには下記のようにする必要があります。

sed "s/置き換え前/置き換え後/g"

最後尾に”g”を追加することで複数の置き換えをすることができるようになります。

echo "FascodENEtwork" | sed "s/E/e/g"
-> FascodeNetwork

置き換えることができましたね。

例3

echo "https:/blog.Fascode.net/" | sed "s//////"
-> sed: -e expression #1, char 5: `s' に対するオプションが不明です

エラーが出ましたね。
エラーが出た理由は区切り文字(以降はデリミタと表記します。)の”/”が置き換え対象の”/”との見分けがつかなくなったからです。

実は一文字であれば大抵の文字はデリミタとして使えます。
“A”でもいいですし、”|”や”@”でも使えます。
個人的には文字列に含まれることが少ない”@”や”|”を使うのがおすすめです。

echo "https:/blog.Fascode.net/" | sed "s|/|//|"
-> https://blog.Fascode.net/

置き換えることができましたね。
今回は最初の文字のみの置き換えしたかったので”g”は使いません。

例4

小文字を大文字に

echo "Fascode Network" | sed "s/Fascode Network/FASCODE NETWORK/" test.txt
-> FASCODE NETWORK

小文字から大文字に変換してみましたが、これでは柔軟性がありません。
なので、最後にtrを紹介したいと思います。

tr

sedよりも柔軟で書きやすいのが特徴です。

例2のtr版

echo "FascodENEtwork" | tr E e
-> FascodeNetwork

たったこれだけです。

例4のtr版

echo "Fascode Network" | tr [a-z] [A-Z]
-> FASCODE NETWORK

こちらのほうがスマートですね。

例3のtr版

あれ?sedいらなくね? と思った人もいるのではないでしょうか?
trにはひとつだけ弱点があって文字列の置き換え、1文字を2文字に置き換えといったことができません。

echo "https:/blog.Fascode.net/" | tr / //
-> https:/blog.Fascode.net/

sedはこういった時に必要となります。

最後に

sedとtrを使い分けることが大切です。

コメント

タイトルとURLをコピーしました