sed 정규식을 사용하여 단어 끝 문자를 제거해 보세요.

sed 정규식을 사용하여 단어 끝 문자를 제거해 보세요.

저는 regex와 sed를 처음 접했고 간단한 regex라고 생각되는 것을 만들려고 합니다. 단어 끝의 문자를 제거하고 싶습니다("o"인 경우).

  • 입력 문자열: 안녕하세요 안녕하세요
  • 예상 출력: 지옥 지옥

좋은 소식: 문자열 끝에 있는 "o"를 제거할 수 있습니다.

$ echo 'Hello Hello' |sed 's/\(.*\)o/\1/g'
Hello Hell
$ echo 'Hello Hello' |sed 's/\(.*\)o$/\1/g'
Hello Hell

나쁜 소식: 문자열의 이전 단어에서 해당 단어를 제거할 수 없습니다. 저는 제가 생각할 수 있는 모든 앵커 기호를 사용해 보았습니다. 결과적으로 단어 끝에 있는 "o"는 하나도 삭제되지 않았습니다.

$ echo 'Hello Hello' |sed 's/\(.*\)o\b/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\>/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\W/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\s/\1/g'
Hello Hello

내가 뭘 잘못했는지 말해줌으로써 제 정신을 되찾도록 도와주실 수 있나요?

업데이트: 나는 내 기계가 다른 사람의 기계와는 다른 결과를 낳는다는 뚜렷한 인상을 받았습니다. 저는 Macbook에서 터미널 창을 사용하고 있습니다. 누구든지 이것에 대해 밝힐 수 있다면 알려주십시오.

답변1

echo 'Hello Hello' | sed 's/o$//'

당신 것보다 나에게 더 유용한 것 같아요

echo 'Hello Hello' | sed 's/\(.*\)o$/\1/g'

귀하의 질문은 출력에 관한 것입니다

echo 'Hello Hello' | sed 's/\(.*\)o\b/\1/g'

Hello Hello, 하지만 저에게는 그렇습니다 Hello Hell. 으로 수정하시면 됩니다

echo 'Hello Hello' | sed 's/\([^o]*\)o\b/\1/g'

하지만

echo 'Hello Hello' | sed 's/o\b//g'

나에게는 더 나은 것 같습니다.

답변2

o단어 끝의 를 제거하면 단어 문자와 단어가 아닌 문자(또는 EOL) 사이의 ao가 제거됩니다.

sed -r 's/(\w)o(\W|$)/\1\2/g'

답변3

space귀하의 단어 구분 기호가 아닌지 궁금합니다 . 다음을 시도해 보세요:

$ echo hello hello | sed -e 's/o / /g;s/o$//'
hell hell

이 예의 문제점은 .and 및 기타 단어 구분 기호에도 ,동일한 작업을 수행 해야 한다는 것입니다. 일치 항목 뒤에 like o와 같은 다른 특정 문자가 옵니다 . 어떤 이유로 EOL에서는 작동하지 않으므로 를 사용하여 다른 검색 문자열을 추가하세요 . 예:[]o[ \.,]$;

$ echo hello hello, hello. toot hello | sed -e 's/o\([ \.,]\)/\1/g;s/o$//'
hell hell, hell. toot hell
$ echo $SHELL
/bin/bash
$ sed --version
sed (GNU sed) 4.4
$ set | grep IFS
IFS=$' \t\n'

답변4

저는 제가 생각할 수 있는 모든 앵커 기호를 사용해 보았습니다.

닻이 아니라 별표와 탐욕스러운 일치를 하고 있다는 사실입니다. 이 \(.*\)o일치가능한 가장 긴 문자열, 그러니까 다 먹어치워마지막 o. o이전 항목과 일치할 수도 있습니다 .

그러나 무언가를 잡아서 반환하는 것은 소용이 없습니다. \(.*\)및 를 제거할 수 있습니다 \1.

따라서 (적어도 GNU sed에서는) o단어 끝에 있는 항목을 제거합니다.

sed 's/o\>//g' 
sed 's/o\b//g' 

물론 이는 문자열 끝에만 해당됩니다.

sed 's/o$//g' 

o그러면 다음과 같은 단어가 아닌 문자(예: 다음 공백 Hello) 도 제거됩니다 .

sed 's/o\W//g' 

/ 또는 를 sed지원하지 않으면 다른 조치를 취해야 합니다. 이는 영숫자가 아닌 문자 또는 줄 끝이 뒤따르는 것과 일치합니다 .\<\>\bo

$ echo "jello, jello" | sed -E -e 's/o([^[:alnum:]]|$)/\1/g'
jell, jell

sed이는 예를 들어 OS X/macOS와 함께 제공되는 운영 체제에 적용됩니다.


Perl 정규식은 물음표 추가 *또는 +탐욕스럽지 않게 만드는 것을 지원합니다. 그러면 그들은 일치할 것이다가장 짧은가능한 문자열:

echo "jello, jello" | perl -pe 's/(.*?)o/$1/g'
jell, jell

관련 정보