何百ものソースコードファイルがあります。ファイル名のパスに基づいて名前空間の名前を変更したいと思います。もちろん、スラッシュはドットに置き換える必要があります。
私は前に試しました検索 - 実行ただし、ファイル名を内部から取得することはできません。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;