스크립트가 실행될 때마다 달라질 수 있는 파일의 단어를 바꿔야 하는 요구 사항이 있습니다. 파일의 내용은 다음과 같습니다.
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
- 필요하지 않은 것을 교체하는 대신
^
앞에 추가하고 싶을 수도 있습니다 .class
instance=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 insed
과 동일[^\s]
하며\
및 를 제외한 모든 문자와 일치합니다s
.
1 PERL_UNICODE
환경 변수가 설정되지 않았다고 가정합니다.
답변3
나는 "클래스"가 항상 존재하고 줄의 시작 부분에 있다고 가정하여 이것을 제시합니다.
$ sed 's/^class [^ ]*/class RequiredContent/'
class RequiredContent > Something
[^ ]*
"class" 뒤에 공백이 아닌 모든 내용을 "class"와 원하는 새 문자열로 바꿉니다.