2015-01-26 4 views
3

가 나는이 같은 문자열이 말 : 난 단지 쉼표, 마침표, 또는 제외 인용 내부에 영숫자가 아닌 문자를 제거 하려는는 나오지 : 견적 내부의 모든 영숫자가 아닌 문자를 제거에만

Output: 
I have some-non-alphanumeric % characters remain here, I "also, have_+ some & .here" 

을 공간는 :

Desired Output:  
I have some-non-alphanumeric % characters remain here, I "also, have some .here" 

나는 문자열을 일치하고 따옴표 안에 삭제 다음 sed 명령을 시도했다, 그러나 그것은 한때 안에 모든 내용이 삭제 따옴표 포함 OTES : 어떤 도움 바람직 sed를 이용하여 알 수있다

sed '/characters/ s/\("[^"]*\)\([^a-zA-Z0-9\,\. ]\)\([^"]*"\)//g' 

는 원하는 출력을 얻기 위해. 미리 감사드립니다!

+0

sed는 이에 적합한 도구가 아닙니다. Perl은 어떻습니까? 펄 솔루션을 원했어? –

+0

글쎄, 나는이 코드를 다른 사용자에게 넘겨 줄 기존 스크립트에 추가하고있다. #!/bin/bash는 필자의 쉘이기 때문에 여기서는 펄이 유용하다고 생각하지 않는다. –

답변

2

.

sed ' 
# If the line contains /characters/, just to label repremove 
/characters/ b repremove 
# else, jump to end of script 
b 
# labels are introduced with colons 
:repremove 
# This s command says: find a quote mark and some stuff we do not want 
# to remove, then some stuff we do want to remove, then the rest until 
# a quote mark again. Replace it with the two things we did not want to 
# remove 
s/\("[a-zA-Z0-9,. ]*\)[^"a-zA-Z0-9,. ][^"a-zA-Z0-9,. ]*\([^"]*"\)/\1\2/ 
# The t command repeats the loop until we have gotten everything 
t repremove 
' 

(이것은 [^"a-zA-Z0-9,. ]* 없이도 작동하지만, 그것은 많은 영숫자가 아닌 문자를 포함하는 행에 속도가 느려질 수 있습니다 : 나오지도 이러한 루프를 수행하면 bt 명령의 라벨 및 사용을 필요로 행)

perl에서 이렇게하는 것이 훨씬 쉽지만 다른 대답이 옳다.

+0

이것은 완벽하게 작동했습니다! hep에 감사드립니다! –

2

Sed는 이에 적합한 도구가 아닙니다. 다음은 Perl을 통한 것입니다.

perl -pe 's/[^a-zA-Z0-9,.\s"](?!(?:"[^"]*"|[^"])*$)//g' file 

예 :

$ echo 'I have some-non-alphanumeric % characters remain here, I "also, have_+ some & .here"' | perl -pe 's/[^a-zA-Z0-9,.\s"](?!(?:"[^"]*"|[^"])*$)//g' 
I have some-non-alphanumeric % characters remain here, I "also, have some .here" 
당신은 모든 영숫자가 아닌 문자를 제거하기 위해 대체 여러 번 반복해야

Regex Demo