2009-09-09 7 views
0

다음과 같은 파일이 있습니다.개행 문자를 제외한 모든 단어가 아닌 문자를 제거하려면 어떻게해야합니까?

my line - some words & text 
oh lóok i've got some characters 

'정규화'하고 모든 비 단어 문자를 제거하고 싶습니다. 나는 다음과 같이 끝내고 싶다.

mylinesomewordstext 
ohlóokivegotsomecharacters 

나는 현재 명령 행에서 리눅스를 사용하고 있으며, 내가 사용할 수있는 한 줄짜리 줄이 있기를 바라고있다.

나는 이것을 시도했다 :

cat file | perl -pe 's/\W//' 

하지만 모든 줄 바꿈을 제거하고 모든 것을 한 줄을 넣었다. 펄이 \W에 개행 문자를 포함하지 않는다고 말할 수 있습니까? 아니면 다른 방법이 있습니까?

답변

7

이것은 \w 또는 \n 일치하지 않는 문자를 제거합니다. 적어도 내 경우에는. STH의 솔루션 @

sed 's/\W//g' file 
+0

이렇게하면 원본 텍스트에 악센트 부호 o가 표시됩니다. –

+0

유니 코드 인식을 얻으려면 명령에 플래그를 추가해야합니다. -C해야합니다. http://perldoc.perl.org/perlrun.html#Command-Switches –

+0

오른쪽으로 변경했습니다. – sth

1

:

+1

쓸데없는 고양이 – camh

+0

사용. 너무 늦게 보았습니다 =/ – dcruz

+1

답을 자유롭게 편집하십시오. – Ether

4

는 (적어도 내 시스템에)입니다 유니 코드 호환, 따라서이 악센트 오 문자를 잃게 펄을 사용합니다. 한편

, sed 은 (the lists on this page에 따라) 유니 코드 호환되며, 정확한 결과 제공 : 쉘 스크립트에 대한

$ sed 's/\W//g' a.txt 
mylinesomewordstext 
ohlóokivegotsomecharacters 
1

가장 좋은 방법은 당신이 하나의 교체에 대한 TR 프로그램을 사용해야한다는 지시를 문자는 sed 대신에 사용됩니다. 왜냐하면 더 빠르고 더 효율적이기 때문입니다. 분명히 긴 문자열을 대체하는 경우 sed를 사용하십시오.

그럴 -d '[: 빈 :] [: PUNCT :]'< 파일

시간을 실행하면 내가 얻을 :

실제 0m0.003s
사용자 0m0 .000s
에 sys 0m0.004s 내가 나오지도 대답을 실행하면

(나오지도 시간 -e '의/\ W // g'파일) 내가 얻을 :

실제 0m0.003s
사용자는
에 sys 0m0.004s

을 0m0.004s "하지 않는 동안 거대한 "차이점이라면 더 큰 데이터 세트를 실행할 때 차이점을 알 수 있습니다. 또한 I/O 리다이렉션 (산란 프로세스가 하나 더 적음)을 사용하는 대신 cat의 출력을 tr으로 파이프하지 않았 음을 알아 두십시오.당신이 필요하지 않습니다

perl -ple 's/\W//g' file 

주의 사항 : 펄에서

2

, 난 그냥 -l 스위치를 추가 할 것입니다 모든 인쇄()의 말미에 추가하여 줄 바꿈을 다시는-추가 cat.

관련 문제