sed에서 점 (.) 교체


9

실제 질문은- M-BM-다른 캐릭터를 잃을 위험없이 특수 캐릭터 를 제거하는 방법을 아는 사람이 있습니까?

텍스트 문자열이 있습니다.

" . . ."

그건

space dot space dot space dot

텍스트 파일 에서이 문자열의 모든 발생을 바꾸려고합니다.

"..."

그건

dot dot dot

나는 sed와 관련이있었습니다.

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

불행히도 입력 파일을 조금이라도 변경하지는 않습니다. 파일 : https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

텍스트 편집기에서 동일한 문자열을 바꾸려고 할 때 (geany를 사용합니다) 올바르게 찾아서 바꿉니다.

내가 생각할 수있는 유일한 이유는 그 공백 중 일부 (또는 전부)가 실제로 공백이 아니라 특별한 성격이기 때문입니다.

누구든지 해당 문자열을 찾아서 sed (또는 다른 명령 줄 도구)로 바꾸는 방법을 알고 있습니까? 문제가 생각보다 명확하지 않기 때문에 내 파일에서 아이디어를 테스트하십시오. 이것이 내가 그것에 대해 묻는 이유입니다.

cat -Amyfile을 사용한 후에 는 해당 공백이 공백이 아니라 M-BM-특수 문자 라는 문제가있는 것 같습니다 . .다른 문자가 제거 될 위험이 있으므로 검색에 제안 된 기호를 사용하는 것은 좋지 않습니다.

답변:


10

먼저 실제 파일을 사용하는 것보다 테스트 echo하고 파이핑하는 것으로 시작 sed합니다. 둘째, {n}확장 정규식 모델에서를 사용하여 배수와 한계를 나타낼 수 있습니다.

당신은 거의 거기에 있었지만 정규 표현식은 앞선 공간을 기대했습니다.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

(가) 주 \s?I 출력에 공간을 추가했습니다, 그래서 여전히 출력을 파괴하는 욕심이 충분하다. 당신은 그것을 원하지 않을 수 있습니다. 또한 공간을 선택적으로 만들었으므로 다음과 모두 일치합니다.

...
. ..
.. .
. . .
 . . . 

옵션 ?플래그를 제거하십시오 .


주석에 유니 코드에 대한 문제가 주어지면 데이터를 ASCII와 동등한 것으로 강제 iconv한 다음 sed 할 수 있습니다.

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text

echo최소한 파일을 캐터링 할 때 셸이 아무 것도 해석하지 않고 에코도 아닌 것을 알고 파일을 캐터링하는 대신 사용 하는 것이 좋습니다 .
Flimm

점이있는 간단한 예제의 경우 @Flimm, 이것은 실제로 문제가되지 않습니다. 파일에서로드하려는 경우 귀찮게하지 마십시오 . 파일 catsed로드하면 (OP의 예에 따라) 인라인으로 저장하지 마십시오 (제거 -i이므로 출력을보고 테스트 할 수 있습니다).
Oli

@Oli 그것은 당신의 예제와 함께 작동하지만 내 파일에서는 작동하지 않습니다 (제 질문에는 링크가 있습니다). 그것은 문제입니다-당신의 명령과 다른 사람들이 작동해야하지만, 그 점들에 문제가 있기 때문에 그들은 아닙니다. 내 파일에서 명령을 테스트하면 작동하지 않는 것을 볼 수 있습니다.
Rafal

1
@Rafal 살펴보면 cat -A sed-dots점 사이의 "공백"이 특수 M-BM- 문자 라는 것을 알 수 있습니다. 점이 어떻게 생겼는지 확실하지 않지만 교체해야합니다. 잘 타겟팅하지 못하면 다음과 같이 작동합니다. sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@Oli 작동합니다. 정말 고마워! 구문을 설명해 주시겠습니까? 부작용이없고 다른 것으로 대체되지 않습니까? 내가 아는 한,이 RegExp은 점 뒤에있는 모든 문자와 일치합니다. 그러나 M-BM은 ​​하나의 문자가 아니며 3입니다. 어떻게 작동 할 수 있습니까?
Rafal

0

"."를 "."로 바꾸려면 다음을 시도하십시오.

sed -r 's/\. /\./g' -i sed-dots

이 아니라면 ". . ." "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots

0

파일을 실행할 때 파일을 사용할 수 있습니다.

tr '\240' ' ' < sed-dots.txt > sed-dots.new

이것은 변환 단계없이 작동했습니다.

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt

작동하지 않습니다. 나는 그 이유가 @Oli가 찾은 이상한 M-BM 캐릭터라고 생각합니다.
Rafal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.