シェルスクリプトで文字を置き換えるとき、以下のようにsed
コマンドを使うことが一般的だと思います。
$ sed -e 's/変更前の文字列/変更後の文字列/g' ./file.txt > ./file-new.txt
ファイル内の文字列全部を書き換えるときは確かにsed
コマンドが便利だし直感的です。
実は他にもbashの標準機能を使うことで文字列単体を置換することもできるので、今回はその方法を解説します。
bashを使う
# !/bin/bash
tmp="/dir1/dir2/dir3/1234_Abcde_01.jpg.html"
echo ${tmp#/}
echo ${tmp##*/}
echo ${tmp%%.*}
echo ${tmp/d/D}
echo ${tmp//d/D}
hoge=${tmp##*/}
echo ${hoge%%.*}
例えば、上記のようなシェルスクリプトを書くと以下のように変換されます。
dir1/dir2/dir3/1234_Abcde_01.jpg.html
1234_Abcde_01.jpg.html
/dir1/dir2/dir3/1234_Abcde_01
/Dir1/dir2/dir3/1234_abcde_01.jpg.html
/Dir1/Dir2/Dir3/1234_abcDe_01.jpg.html
1234_Abcde_01
やってる処理を順番に書くと
- 先頭の
/
を取り除く - 末端の
/
までまとめて取り除く - 末尾の
.
を取り除く(%なら末尾から1つ目の.*を取り除く
) - 先頭の
d
をD
で置換 - 全ての
d
をD
で置換 - 2と3の複合型
覚えておくと、変数に代入したちょっとした文字列を変換する時に便利。
ファイル単位で変換したい時はsed
のほうが使いやすそうです。
メモ
これ書いてるときに解消したエラーについて。
bash(シェルスクリプト)で条件文を書こうとしているときに
[: =: unary operator expected
のようなエラーが出た時は以下のようにして対処。
if [ "$var" = '' ]; then
echo 'テストecho'
fi
"$var"
と書くのと半角スペースを正しく記載する
のがポイントのようです。
(シェルスクリプトは半角スペースや改行の指定の仕方に注意ですね)
参考
シェルスクリプトによる置換や削除
空行を検出するスクリプトを書いていた
Bash の if 文(test文)のオプションを整理してみた
Bashで正規表現マッチした文字列を取り出す