ファイル名を取得し、古い名前空間の場所に書き込みます。

ファイル名を取得し、古い名前空間の場所に書き込みます。

何百ものソースコードファイルがあります。ファイル名のパスに基づいて名前空間の名前を変更したいと思います。もちろん、スラッシュはドットに置き換える必要があります。

私は前に試しました検索 - 実行ただし、ファイル名を内部から取得することはできません。sed現在の名前空間をパスに置き換えます。

find -type f -iname *.cs  -exec  sh -c 'x="{}"; sed -E "s/\//./; s/(namespace.Project).+/\1.$x/" {}' \;

しかし、私は理解しています

sed: -e 式 #1、文字 36: 's' の未知のオプション

答え1

最初のsedコマンド(s/\//./)はファイル内のすべてのスラッシュをドットに置き換えます。コンテンツ、ファイル名ではありません。

2番目のsedコマンド(s/(namespace.Project).+/\1.$x/$xは、名前空間に(まだ変更されていないファイルパス)を追加します。sedで解釈されたエスケープされていないスラッシュが含まれているため、エラーが発生しますsed

バラよりこの関連質問


また、読んでください。find -exec sh -c安全に使用する方法。 Bashにコンテンツを直接追加するのは{}セキュリティ上の悪夢です。

答え2

まあ、私はbash変数を使って私の道を見つけました。このような:

for i in `find -type f -iname *.cs`; do j=$(echo $i|sed -E 's/\.\//namespace Project\//g;s/\//./g; s/(\.[[:alnum:]]*\.cs$)//g'); sed -i -E "s/(namespace Project.+)/$j/g" $i ; done;

関連情報