수백 개의 소스 코드 파일이 있습니다. 파일 이름 경로를 기반으로 네임스페이스의 이름을 바꾸고 싶습니다. 물론 슬래시는 점으로 대체되어야 합니다.
나는 전에 시도했다찾기-실행하지만 파일 이름을 내부에서 가져올 수 없습니다.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;