GNU/Linux >> Linux の 問題 >  >> Linux

sed初心者:フォルダー内のすべての出現を変更する

sed だけを使用してそれを行う方法はありません。少なくとも find ユーティリティを一緒に使用する必要があります:

find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;

このコマンドは .bak を作成します 変更された各ファイルのファイル。

注:

  • -i sed の引数 コマンドは GNU 拡張であるため、このコマンドを BSD の sed で実行している場合 出力を新しいファイルにリダイレクトしてから、名前を変更する必要があります。
  • find ユーティリティは -exec を実装していません 古い UNIX ボックスの引数なので、 | xargs を使用する必要があります

find | xargs cmd を使用したい find -exec以上 覚えやすいからです。

この例では、現在のディレクトリ以下の .txt ファイルで「foo」を「bar」にグローバルに置き換えます。

find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"

-print0 および -0 ファイル名にスペースなどの奇妙な文字が含まれていない場合は、オプションを省略できます。


移植性のために、Linux や BSD に固有の sed の機能には依存していません。代わりに overwrite を使用します Unix プログラミング環境に関する Kernighan と Pike の本からのスクリプト。

コマンドは

find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'

そして overwrite スクリプト (私はあちこちで使用しています) は

#!/bin/sh
# overwrite:  copy standard input to output after EOF
# (final version)

# set -x

case $# in
0|1)        echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac

file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15    # clean up files

if "[email protected]" >$new               # collect input
then
    cp $file $old   # save original file
    trap 'trap "" 1 2 15; cp $old $file     # ignore signals
          rm -f $new $old; exit 1' 1 2 15   # during restore
    cp $new $file
else
    echo "overwrite: $1 failed, $file unchanged" 1>&2
    exit 1
fi
rm -f $new $old

これは、コマンドが成功した場合にのみファイルを上書きするという考え方です。 find で便利 また、使用したくない場所

sed 's/old/new/g' file > file  # THIS CODE DOES NOT WORK

シェルは sed の前にファイルを切り捨てるため 読めます。


Linux
  1. Linuxで1つの特定のファイルを除いてフォルダ内のすべてのファイルを削除する方法

  2. Sedを使用して2つの文字列のすべてのオカレンスをきれいに交換しますか?

  3. 一致するまですべてのファイルを表示しますか?

  1. フォルダ内のすべてのファイルを印刷しますか?

  2. フォルダ内のすべてのファイルにテキストを追加しますか?

  3. テキスト ファイル内の文字列を削除する

  1. Sed:最初の文字列を除く文字列のすべての出現を削除しますか?

  2. SedですべてのCコメントを削除しますか?

  3. フォルダー内のすべてのファイル内の文字列のすべての出現をカウントする