RedHatでファイル内の文字列をsedで置換→同ファイルにリダイレクトしたときに、ファイルが0バイトになりました。
AIXではそんなことがなかったのでびっくりしました。
そんな経験を踏まえて、ファイル内の文字列の置換・そのまま保存する方法や、変数の文字列の置換などまとめてみました。
- 目次 -
sed
を使った置換
sed
(stream editor)は、ファイルや標準入力のテキストを編集・置換するのに使います。
基本構文:
sed 's/置換前の文字列/置換後の文字列/g' ファイル名
s/…/…/
は置換コマンド(s
は substitute の略)/g
をつけると、1行内のすべての一致する部分を置換する
$echo "Hello World" | sed 's/World/Bash/'
Hello Bash
ファイルの内容を置換(上書きなし)
input.txt を置換した結果をoutput.txt に出力する方法。
$ sed 's/foo/bar/g' input.txt > output.txt
ファイルの内容を直接置換(上書き)
はじめはこれがしたかった。
input.txtを置換して、そのままinput.txtとして保存する方法。
$ sed -i 's/foo/bar/g' input.txt
(Macの場合は -i ''
を追加)
$ sed -i '' 's/foo/bar/g' input.txt
2. awk
を使った置換
awk
はテキスト処理に強力なツールですよねー。sedでやりがちだけど、awkでも置換できます。
例:
$ echo "Hello World" | awk '{gsub("World", "Bash"); print}'
Hello Bash
3. perl
を使った置換
Perlの -pe
オプションを使うと、テキストの置換が簡単にできます。sedに似てるので要件がなければ使う頻度は少なそう。
$ perl -pe 's/World/Bash/g' input.txt
ファイルの内容を直接変更
$ perl -pi -e 's/foo/bar/g' input.txt
4. tr
を使った文字単位の置換
単純な1文字ずつの置換なら tr
が便利。
echo "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD
5. ${変数//置換前/置換後}
を使った変数の置換
変数の値を変更する場合、Bashの文字列置換機能を使うこともできます。
コマンドの出力を変数に代入して、一部置換して、とかに便利です。
text="Hello World"
echo "${text//World/Bash}"Hello Bash
まとめ:用途別おすすめ
目的 | コマンド |
---|---|
ファイルのテキストを置換 | sed -i 's/foo/bar/g' file.txt |
変数の値を置換 | new_text=${text//old/new} |
1行ずつ置換して出力 | awk '{gsub("old", "new"); print}' file.txt |
文字単位の変換 | tr 'a-z' 'A-Z' |

コメント