파일 이름을 가져와서 이전 네임스페이스 위치에 씁니다.

파일 이름을 가져와서 이전 네임스페이스 위치에 씁니다.

수백 개의 소스 코드 파일이 있습니다. 파일 이름 경로를 기반으로 네임스페이스의 이름을 바꾸고 싶습니다. 물론 슬래시는 점으로 대체되어야 합니다.

나는 전에 시도했다찾기-실행하지만 파일 이름을 내부에서 가져올 수 없습니다.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/\//./)은 파일의 모든 슬래시를 점으로 바꿉니다.콘텐츠, 파일 이름이 아닙니다.

두 번째 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;

관련 정보