sed 명령을 사용하여 동적 단어 바꾸기

sed 명령을 사용하여 동적 단어 바꾸기

스크립트가 실행될 때마다 달라질 수 있는 파일의 단어를 바꿔야 하는 요구 사항이 있습니다. 파일의 내용은 다음과 같습니다.

class DynamicContentToReplace > Something

여기서는 sed 명령을 사용하여 [DynamicContentToReplace]를 필수 콘텐츠로 바꿔야 합니다. [DynamicContentToReplace]는 공백을 제외한 모든 것을 포함할 수 있습니다.

우리가 취할 수 있는 가정은 파일에 다음 class단어가 포함된 줄만 포함되어 있다는 것입니다.

원하는 출력

class RequiredContent > Something

다음 명령을 시도했지만 sed -e "s/\(class \)\([^\s]+\)/\1RequiredContent/"여전히 내용을 바꾸지 못했습니다. 내가 여기서 무엇을 놓치고 있습니까? 나는 이미 경험했다이것포스팅도 합니다. 하지만 해결책을 찾지 못했습니다.

답변1

  • 기본 정규식의 경우 +수량자를 이스케이프 처리해야 합니다.
  • \+*GNU 확장이므로 또는 대신 사용해야 할 수도 있습니다 \{1,\}.
  • 를 사용 [^[:space:]]하거나 간단히 [^ ]바꾸십시오 [^\s]. GNU를 사용하면 공백을 제외한 모든 것을 sed사용할 수도 있습니다 \S.
  • 두 번째 그룹은 \2어디에도 사용하지 않으므로 캡처할 필요가 없습니다.
  • sed명령이 하나만 있는 경우에는 필요하지 않습니다.-e
  • 필요하지 않은 것을 교체하는 대신 ^앞에 추가하고 싶을 수도 있습니다 .classinstance=my_class_something()

사용:

sed 's/^\(class \)[^[:space:]]*/\1RequiredContent/'

또는 확장 정규식( sed -E)을 사용하세요.

sed -E 's/^(class )\S+/\1RequiredContent/'

답변2

Perl 정규식 연산자를 사용하고 있는데 왜 Perl을 사용하지 않는 걸까요?

perl -pe 's/\bclass\s+\K\S+/RequiredContent/g' < your-file
  • \b앞에 단어 문자가 없는 한 일치하는 단어 경계 연산자입니다 class.
  • \s모든 공백 문자(ASCII 문자만 해당)와 일치합니다. 사용자의 로케일이나 UTF-8에 입력을 디코딩하라고 지시하지 않았기 때문에 perl입력은 ISO8859-1로 인코딩된 것으로 해석됩니다(다행히 0xa0 바이트, ISO8859-1의 비 전용 u해당 대체 항목에 플래그를 추가하지 않으면 s공백 인코딩을 깨는 것은 공백으로 간주되지 않습니다.
  • \K일치하는 문자열의 시작 부분을 재설정하여 이후에 일치하는 항목만 교체하므로 대체 항목에 다시 추가하기 위해 이전에 나온 항목을 캡처할 필요가 없습니다.
  • \S공백이 아닌 문자입니다. Perl에서 이는 [^\s]while in sed과 동일 [^\s]하며 \및 를 제외한 모든 문자와 일치합니다 s.

1 PERL_UNICODE환경 변수가 설정되지 않았다고 가정합니다.

답변3

나는 "클래스"가 항상 존재하고 줄의 시작 부분에 있다고 가정하여 이것을 제시합니다.

$ sed 's/^class [^ ]*/class RequiredContent/'
class RequiredContent > Something

  • [^ ]*"class" 뒤에 공백이 아닌 모든 내용을 "class"와 원하는 새 문자열로 바꿉니다.

관련 정보