2017-03-03 6 views
1
grep -Hrl DataLogger /testFolder/ | xargs sed /,$/{N -e"s|DataLogger::copyStringLength(\(dl.[a-zA-Z0-9]\+\)..\(.\+\)(.c_str()\)\+\(,\s*.*;)|IDataLogger::copyString(\2, \1);|g"} 

위의 스크립트를 사용하여 DataLogger::copyStringLength(dest, source, length)에서 IDataLogger::copyString(source, dest)으로 메서드 호출을 변경하고 있습니다.sed not place in print

위의 스크립트는 내가 원했던 것처럼 보이고 메소드 호출의 개행과 상관없이 모든 것을 대체합니다. 하지만 지금은 그대로 파일의 내부가 아닌 콘솔로만 인쇄됩니다. 나는 sed 호출의 여러 위치에 -i 옵션을 넣으려고 시도했지만 항상 오류가 발생합니다.

의견을 보내 주시면 감사하겠습니다. 왜, 어디에 줄 바꿈이 3 가지 형식이 메소드가, 표시 궁금 분들을 위해

내가 볼 수 없습니다

copyStringLength(varA, varB, varC); 

copyStringLength(varA, varB, 
       varC); 

copyStringLength(varA, 
       varB, 
       varC); 
+0

OS X에서이 작업을 수행하고 있습니까? – Barmar

+0

있다면 http://stackoverflow.com/questions/4247068/sed-command-with-i-option-failing-on-mac-but-works-on-linux/4247319#4247319 및 http : //를 참조하십시오. stackoverflow.com/questions/7573368/in-place-edits-with-sed-on-os-x/7573438#7573438 – Barmar

+0

우리는 RHEL6에서 실행 중입니다. 첫 번째 질문을 살펴 보았지만 백업 파일을 표시하지 않는 방법이 있으면 좋을 것입니다. 필요는 없지만 여러 가지 찾기/삭제를 실행하는 것을 저장합니다. –

답변

0

(변수 이름의 길이에 따라) 방법 sed 명령 귀하의 질문에 어긋나는 방식으로 작업 할 수 있습니다 (원래 스크립트의 복사본에서 실수 일 수 있습니다).

  • 매개 변수 , (문자열, 호출되는 함수 등)
  • 함수 호출이 최대 3 줄에 나누어을 containng 수 없습니다

    어쨌든, 당신의 코드에서 나는이 가정을 얻을 수 있습니다.

    grep -rl DataLogger /testFolder/ | xargs sed -i \ 
        -e '/,\s*$/N;/,\s*$/N' \ 
        -e 's/\(DataLogger::copyString\)Length(\s*\([^,]\+\)\s*,\s*\([^,]\+\)\s*,.*);/I\1(\3, \2);/g' 
    

    설명 그렙 -H-l에서

    • 은 동일하다 -r (재귀) 옵션 (파일 이름 인쇄) :

  • 명령 행이 될 것이라고 말했다 .
  • -i 편집 (백업)없이 제자리에서 파일
  • -e
  • -e 처음의 스위치한다 (뒤에 공백 무시) 다음 하나 , 끝나야 처음 두 행 합류 두 번째 매개 변수는 세 번째 매개 변수와 그 사이의 공백을 제외합니다.

파일 이름에 공백이 없다고 가정하면 sed이 실패합니다.