특수문자 제거/교체 문제 °

특수문자 제거/교체 문제 °

이 ° 기호를 없앨 수는 없을 것 같습니다.

나는 시도했다:

  sed 's/°//g' file.txt

그리고

  sed 's/\°//g' file.txt

그러나 둘 다 작동하지 않습니다.

저는 우분투 16을 실행하고 있습니다.

기호가 감지되지 않는 것 같습니다. 복사하여 붙여넣었습니다.

이것은 또한 기호를 찾는 데 아무 것도 수행하지 않습니다.

  sed '/°/!d' file.txt

어떤 제안이 있으십니까?

답변1

첫 번째는 이미 작동하고 있을 것입니다. 이 기호는 ASCII가 아닌 문자이지만 특별한 의미는 없습니다. 아니요 \, 기회주의적으로 굴지 마세요. 없이 작동해야 한다면 \그렇게 작동하도록 만드세요! 당신이 시도하는 것처럼

sed 's/ő//g'

이 경우 가장 가능성 있는 원인은 다음과 같습니다.

  1. 인코딩 문제. 파일이 어떤 인코딩을 사용하는지( file -szL file.txt), 어떤 인코딩을 사용하는지( echo $LANG) 확인하세요. 이는 " °"가 다른 인코딩에서 다른 바이트 시퀀스를 가질 수 있기 때문입니다 . utf-8 형식을 사용하는 것이 가장 좋습니다.확장: Ubuntu 16은 기본적으로 UTF-8 친화적입니다. 최대 미국에서만 매우 오래되고 지속적으로 업그레이드되는 시스템입니다. 이러한 인코딩 문제를 상상할 수 있습니까? 보다 현실적으로 텍스트 파일은 utf-8 형식이 아닙니다. 명령이 file알려줄 것입니다.
  2. 다음을 필터링할 수 있습니다.비슷한역할은 있지만 정확한 역할은 아닙니다. 그다지 오래되지 않은 utf-8 시스템에는 수천 개의 표시 가능한 문자가 있으며 그 중 대부분은 이와 같은 특수 상형 문자이며 어느 하나도 매우 비슷해 보입니다. 이 경우에도 해결책은 간단합니다. cat파일을 만들고 명령줄에 글리프를 복사하여 붙여넣으면 됩니다.

이 내용을 따르면 95%의 사람들이 이 시점에서 문제를 발견하고 해결했습니다. 나머지는 10%의 시간입니다.

이들 중 어느 것도 작동하지 않으면 가장 깊은 바이트 수준에서 디버깅할 수 있습니다. 귀하의 경우에는 다음과 같이 할 것입니다.

  1. 먼저 이 명령으로 시작하겠지만 소스로 sed는 . 이렇게 하면 0바이트의 무한히 긴 스트림에서 무한 루프로 작동하고 그 자리에서 종료되지 않습니다. 따라서 디버깅할 수 있습니다./dev/zerosed 's/°//g' </dev/zero >/dev/nullsed
  2. 실행을 일시 중지하려면 ctrl/z를 사용하세요.
  3. 를 사용하여 pid를 확인하십시오 pidof sed. 최대 5자리 정수를 얻을 수 있습니다.
  4. a를 사용하면 hexcat /proc/12345/cmdline해당 sed 명령줄에 대한 바이트 수준 데이터를 볼 수 있습니다.
  5. °동일한 작업을 수행하여 ""의 바이트 수준 인코딩을 확인할 수 있습니다 hexcat file.txt.
  6. 둘 다 일치해야 합니다. 그렇지 않다면 (2)를 시도하거나 새로운 질문을 해보세요.

많은 Linux 배포판에서는 hexcat아무도 사용하지 않는다고 생각하기 때문에 가장 유용한 도구 중 하나를 배포판에서 제거합니다. 하지만 내가 아는 한, 다른 도구도 있고 아마도 xxd이것이 그 중 하나일 것입니다. 어떤 방법으로도 16진수 덤프를 얻을 수 없는 경우 새 질문으로 문의하세요.

답변2

다음의 간단한 방법을 시도해 보세요.

echo "°" | xxd

그러면 다음과 같은 내용이 반환됩니다.

0000000: c2b0 0a

코드가 필요해c2b0, 제 생각에는 0a가 개행 문자인 것 같아요.

그런 다음 다음을 시도하십시오.

sed -e 's/\xc2\xb0//' file.txt

그것이 효과가 있기를 바랍니다.

관련 정보