【bash】文字列の置換あれこれ

※アフィリエイト広告を利用しています
※アフィリエイト広告を利用しています

RedHatでファイル内の文字列をsedで置換→同ファイルにリダイレクトしたときに、ファイルが0バイトになりました。
AIXではそんなことがなかったのでびっくりしました。
そんな経験を踏まえて、ファイル内の文字列の置換・そのまま保存する方法や、変数の文字列の置換などまとめてみました。

sed を使った置換

sed(stream editor)は、ファイルや標準入力のテキストを編集・置換するのに使います。

基本構文:

sed 's/置換前の文字列/置換後の文字列/g' ファイル名
  • s/…/…/ は置換コマンド(s は substitute の略)
  • /g をつけると、1行内のすべての一致する部分を置換する

ファイルの内容を置換(上書きなし)

input.txt を置換した結果をoutput.txt に出力する方法。

ファイルの内容を直接置換(上書き)

はじめはこれがしたかった。
input.txtを置換して、そのままinput.txtとして保存する方法。

(Macの場合は -i '' を追加)


2. awk を使った置換

awk はテキスト処理に強力なツールですよねー。sedでやりがちだけど、awkでも置換できます。

例:


3. perl を使った置換

Perlの -pe オプションを使うと、テキストの置換が簡単にできます。sedに似てるので要件がなければ使う頻度は少なそう。

ファイルの内容を直接変更


4. tr を使った文字単位の置換

単純な1文字ずつの置換なら tr が便利。


5. ${変数//置換前/置換後} を使った変数の置換

変数の値を変更する場合、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'

コメント

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