Sedを編集できません。通常のファイルではありません。

Sedを編集できません。通常のファイルではありません。

私は直面しているこの問題を解決するためにSOで言及されているさまざまなソリューションを試しました。

すべてのファイルを再帰的に見つけ、いくつかのテキストを変更したいと思います。

これはWindowsのcygwinで使用されるコマンドです。

 find . -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

私が得た結果は

sed: couldn't edit ./xxx/yyy/filename: not a regular file

ここで何か抜けましたか?

答え1

findすべてのファイルとすべてのディレクトリのリストを返します。実際に文字列を含むファイルを見つけるには、検索を制限する必要があります。以下を追加してみてください。

find -type f ... #  Doesn't return directories
find -iname "*.txt" ... #  returns only files ending in '.txt' (case insensitive)

あるいは、本当に豪華になりたい場合は、grepを使用して実際に文字列を含むファイルでのみsedを実行できます。

grep -l -r 'FCLP1025' | xargs sed -i 's/FCLP1025/FCLP1080/g'

grepは-r再帰的に検索し、-l一致するファイルのファイル名のみを一覧表示します。次に、を使用する場合と同様に、xargsstdinを使用して次のコマンドに引数として追加します。{}find -exec cmd {} \;

しかし、Linuxのbashでテストされているので、うまくいかない場合は、grep --helpgit-bash / cygwinでフラグが異なることを確認できます。しかし、通常は同じです。

答え2

あなたのコマンドはディレクトリ(および他の非正規ファイル)を見つけることができます。ディレクトリは使用できませんsed

-type fコマンドにテストを追加すると、通常のファイルのみがfind処理されます。

find . -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

または、標準findオプションとより読みやすい引用を使用してください。

find . -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

ディレクトリを完全にスキップするには、次のように.hg検索-pruneパスからそのディレクトリを削除しますfind

find . -name .hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

findこれにより、というディレクトリに入ることさえ不可能になりました.hg。注文会議このようなディレクトリに行き、その中のすべてをテストするのは-path少し非効率的です。

内部編集では、診断メッセージがない限り端末に出力が生成されないため、コマンドfindの出力はありません。出力は編集したファイルに入ります。sed -isedsed -i

また、上記の最後のコマンドはfind編集を試みます。すべて文書。編集するファイルの名前がわかっている場合は、そのファイルのみを実行するように-name 'some pattern'制限する前に追加できます。-execsed

関連情報