sed 명령은 /,\ 문자가 포함된 문자열을 삭제합니다.

sed 명령은 /,\ 문자가 포함된 문자열을 삭제합니다.

나는 문자열을 가지고

/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

관련 정보