DOS 개행 시퀀스를 고려하면서 파일에서 문자열 발생 횟수를 변경합니다.

DOS 개행 시퀀스를 고려하면서 파일에서 문자열 발생 횟수를 변경합니다.

저는 C# 개발에는 Visual Studio를 사용하고 스크립팅이 필요한 일부 작업에는 Cygwin을 사용합니다. 최근에 프로젝트 파일에서 모든 문자열을 AAA. BBB나는 오래되고 신뢰할 수 있는 라인 시퀀스로 시작했지만 sed실망스럽게도 DOS의 새 라인 시퀀스가 ​​Unix 라인 시퀀스로 변경되었습니다.

이것이 내가 사용하는 것입니다:

sed -i 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

sed내가 원하는 기능을 수행하는 스위치가 없는 것 같습니다 . 나에게 도움이 될 수 있는 다른 Unix 도구가 있습니까?

편집: C# 파일 사이에 Unix 개행 문자가 있는 다른 스크립트가 있습니다. 이 도구는 DOS 버전으로 변경하지 않는 것이 가장 좋습니다. :)

답변1

VS에는 내장 함수가 있어야 합니다.

그렇지 않은 경우 이전 버전을 사용할 수 있습니다 vi.

vi +'bufdo %s/AAA/BBB/g | update' +q $(grep -rl AAA /cygdrive/c/project_path)

답변2

대신 Cygwin의 Perl을 사용할 수 있습니다. 일반적인 sed 명령은 Perl에 쉽게 매핑됩니다. 정규식 구문은 다릅니다(Perl의 확장 정규식, sed의 기본 정규식).

perl -i -pe 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

명령 대체 결과를 파일 목록으로 구문 분석하는 것은 취약합니다. 파일 이름에 공백이나 백슬래시가 있으면 깨집니다. 둘 다 Windows에서는 매우 일반적입니다(경로가 환경 변수에서 오는 경우와 같이 경로가 기본에서 cygwin으로 변환되지 않은 경우 백슬래시가 나타납니다). 사용하십시오 xargs -d '\n'(Windows 파일 이름에 줄 바꿈 없음).

grep -rl AAA /cygdrive/c/project_path | xargs -d '\n' perl -i -pe 's/AAA/BBB/g'

관련 정보