sed
私はGNU sed 4.2.2を使用していますが、検索した後に何らかの理由で奇妙に動作する理由はわかりません。
次の内容を含むディレクトリがあります。
foofile.txt
barfile.txt
bazfile.txt
config/
ケース1
sed -i 's/foo/bar/g' *.txt
これは私が期待どおりに機能します。 3つの汎用ファイルのすべての「foo」を「bar」に置き換えます。
ケース2
sed -i 's/foo/bar/g' *
sed: couldn't edit config: not a regular file
barfile.txt
では、「foo」を「bar」に変更しますが、そうbazfile.txt
ではありませんfoofile.txt
。アルファベット順に展開されたファイルのリストを見て、エラーが発生したときに終了すると*
します。エラーを無視してファイル処理を続行するconfig/
方法はありますか?sed
ケース3
for file in $(find . -maxdepth 1 -type f); do sed -i 's/foo/bar/g' <"$file"; done
sed: no input files
sed: no input files
sed: no input files
sed
なぜこれが起こるのかを説明できますか?入力ファイルを提供するときに入力ファイルがないと表示されるのはなぜですか?
私は次のことができることを知っていますが、このユースケースを解決する方法ではなく、sedがなぜこれを行うのかを尋ねています。
find . -maxdepth 1 -type f -exec sed -i 's/foo/bar/g' {} \;
ベストアンサー1
ケース2:
このディレクトリを避けるには、次のコマンドを使用します
find
。sed -i 's/foo/bar/g' $(find . -maxdepth 1 -type f)
ケース3:
問題は
<"$file"
ループにあり、ファイルをストリームに変換するため、sed
ファイル名は表示されません。ただ削除してください<
:for file in $(find . -maxdepth 1 -type f); do sed -i 's/foo/bar/g' "$file" done