숫자를 바꾸는 정규 표현식이 'sed'에서 작동하지 않습니다.

숫자를 바꾸는 정규 표현식이 'sed'에서 작동하지 않습니다.

리눅스 배쉬를 사용하세요.

1000내 파일에 다음 코드가 있고 숫자 값( )을 다른 값으로 변경하고 싶습니다 .

문서:

//...
if (counter==(1000)) {
// ...

나는 다음 명령을 사용해 보았습니다.

sed 's/[0-9][0-9]+/9999/g' file.cpp

그러나 아무것도 변하지 않습니다.

또한 이러한 변화가 영구적이기를 바랍니다. 어떻게 해야 하나요?

답변1

+당신은 수량자를 사용하고 있습니다확장 정규식구문 설정이지만 sed기본 정규 표현식이 기본적으로 사용됩니다. 따라서 플래그를 추가하여 ERE를 활성화해야 합니다 -E.

sed -E 's/[0-9][0-9]+/9999/' file.cpp

또는 해당 BRE 구성을 사용하십시오.

sed 's/[0-9]\{2,\}/9999/' file.cpp

@Stéphane Chazelas가 지적했듯이 휴대성이 더 좋습니다.


수정되니 참고해주세요두 개 이상의 연속 숫자를 포함하는 줄그룹을 다음으로 대체하여 9999예제와 일치하는 행만 있는지 확인하려면

if (counter==(1000)) {

영향을 받았으므로 적절한 항목을 추가하는 것이 좋습니다.주소 지정자일치 항목을 더욱 구체적으로 만드세요.

sed '/if (counter==([0-9]\{2,\}))/s/[0-9]\{2,\}/9999/' file.cpp 

이렇게 하면 일치하는 라인에서만 교체가 수행됩니다.if (counter==(two-or-more-digit-number))

g입력 예에서는 해당 행에 해당 숫자 그룹이 하나만 있으므로 이 옵션은 불필요한 것 같습니다.


파일을 직접 수정하기 위해 대부분의 sed구현은 이제 -i"in-place" 수정 플래그를 이해합니다. 다시 말하지만, @Stéphane Chazelas가 올바르게 지적했듯이, 이것을 다른 플래그와 함께 사용하는 경우 -i백업 파일을 생성하는 데 사용된 접미사에 대해 예상대로 순서가 올바른지 확인하십시오(GNU에서는 비어 있을 수 있지만 sedFreeBSD/ MacOS 구현):

  • sed -i '' -E 's/.../.../'FreeBSD에서 작동합니다sed
  • sed -i -E 's/.../.../'아니면 sed -Ei 's/.../.../'GNU에서 작업할 예정인가요?sed
  • sed -iE 's/.../.../'E백업 접미사로 처리되므로 작동하지 않습니다 .

관련 정보