나는 문자열을 가지고
/abc/gef \*(cse,fff)
파일에서 제거하려면 전체 문자열 패턴이 일치해야 합니다. 다음을 사용해 보세요.
sed -i '//abc/gef \*(cse,fff)/d' filename
그러나 이로 인해 오류가 발생합니다.
sed: -e 표현식 #1, char xx: sed의 최신 버전이 필요합니다.
또한 성공하지 못한 채 다음 옵션을 시도했습니다.
sed -i '/\/abc\/gef \*(cse,fff)/d' filename
sed -i 's|/abc/gef \*(cse,fff)||g' filename
올바른 명령은 무엇입니까?
답변1
다음은 GNU sed 버전 4.5 및 4.7에서 작동하며 이 문자열을 포함하는 모든 줄을 삭제합니다.
sed '/\/abc\/gef \\\*(cse,fff)/d' file
문자열의 두 인스턴스를 \
이스케이프 처리 하여 구분 기호로 처리되지 않도록 해야 합니다 . 그렇지 않으면 구분 기호가 앞에 있는 문자로 확장됩니다 . 후자는 문자열과 일치하지 않게 만듭니다./
*
f
s
전체 줄이 아닌 전체 파일에서 문자열 자체만 삭제하려는 경우 다른 문자를 구분 기호로 허용하는 옵션을 사용할 수도 있습니다.
sed 's|/abc/gef \\\*(cse,fff)||g' file
|
이스케이프할 필요가 없도록 구분 기호 역할을 합니다 /
.
요구 사항을 충족한다고 확신한 후 파일을 내부에서 편집하려면 다음을 사용할 수 있습니다 -i
.
sed -i '/\/abc\/gef \\\*(cse,fff)/d' file
sed -i 's|/abc/gef \\\*(cse,fff)||g' file
편집: 질문의 문자열이 원래 게시되었을 때와 다르기 때문에 답변을 업데이트했습니다.
답변2
문제는 \
(이스케이프 문자)와 *
(0 이상)이 모두 정규 표현식에서 특별한 의미를 갖는다는 것입니다.탈출하다리터럴 문자로 사용합니다. 이제 무언가를 탈출하는 방법은 \
앞에 를 추가하는 것입니다. 따라서 *
"0 이상"을 의미하는 대신 문자 그대로 별표를 일치시키려면 를 쓸 수 있습니다 \*
. 마찬가지로 이스케이프를 사용하려면 다음 과 같이 \
쓸 수 있습니다 \\
.
$ cat file
foo
bar
/abc/gef \*(cse,fff)
baz
그리고:
$ sed '/\/abc\/gef \\\*(cse,fff)/d' file
foo
bar
baz
/
is 이후 //
에서 일치 연산자를 어떻게 이스케이프했는지 주목하세요 sed
. 그렇기 때문에 우리 /\/abc\/gef
는 //abc/gef
. d
끝에 있는 것은 "이 패턴과 일치하는 모든 줄을 삭제합니다"를 의미합니다.
답변3
이것은 grep의 작업처럼 들립니다.
$ cat file
line 1
line 2
/abc/gef *(cse,fff)
line 4
$ grep -Fxv '/abc/gef *(cse,fff)' file
line 1
line 2
line 4