find 및 sed를 사용하여 줄 끝의 문자 제거

find 및 sed를 사용하여 줄 끝의 문자 제거

java에서 scala로 변환된 코드베이스의 경우 끝에 불필요한 세미콜론이 있는 파일이 많이 있습니다. 이를 제거하려는 시도는 다음과 같습니다.

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done

(참고: gsedMac에서 Since를 사용하는 것은 sed쓰레기입니다..)

그러나 이것은 단순히 작업을 수행하지 않는 것입니다. 세미콜론은 제거되지 않습니다.

다음과 같은 단일 파일에서 실행된다는 점에 유의하세요.

for f in  $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done

하다일하다.

답변1

이것을 사용하지 마십시오:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

이것은 작동합니다~까지이름에 공백이나 기타 쉘 활성 문자가 있는 파일이 있습니다. 우선, 쉘은 두 가지를 모두 수행합니다.단어 분리그리고경로명 확장의 출력에 $(find . -name \*.scala). 그것 없이도 쉘은 수행됩니다단어 분리 그리고경로명 확장및 명령 $f에서 인용되지 않은 항목에 대해 .echogsed

이 경우 다행스럽게도 안정적으로 작동하는 코드를 쉽게 작성할 수 있습니다. find -exec옵션을 사용하면 됩니다.

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +

후행 세미콜론을 동시에 제거하려면 스크립트에 대체 명령을 하나 더 추가하면 됩니다 sed.

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +

답변2

sed를 실행하기 전에 모든 것을 실행하고 싶을 수도 있습니다 dos2unix. dos2unix를 얻는 방법을 물어볼 수 있습니까? 글쎄, 이것이 여기에 다른 답변을 추가하는 주된 이유입니다(아직 댓글을 추가할 담당자가 충분하지 않기 때문입니다). OSX에서 살아남으려면홈브루 패키지 관리자. Homebrew를 설치한 후(2분) 가장 먼저 할 일은배쉬를 업데이트하세요!! OSX는 몇 년 동안 bash를 업데이트하지 않았습니다. 이를 통해 유닉스 유틸리티를 업데이트할 수 있습니다.

과거에 MacPorts 및 Fink에 대해 좋지 않은 경험을 했다면 Homebrew는 그렇지 않습니다. 정말. Homebrew가 없는 OSX는 Cygwin이 없는 Windows와 같습니다. 글쎄,별로; 하지만 당신은 아이디어를 얻습니다.

답변3

이유를 찾았습니다. 파일 에 ^M(DOS 스타일 CRLF)이 있으므로 먼저 다음을 수행해야 했습니다.

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

그런 다음 OP에 표시된 명령이 제대로 작동합니다.

관련 정보