sed 정규식을 사용하여 단어 끝 문자를 삭제하려고 합니다.

sed 정규식을 사용하여 단어 끝 문자를 삭제하려고 합니다.

나는 정규식과 sed를 처음 접했고 간단한 정규식이 될 것이라고 생각한 것을 만들려고 노력하고 있습니다. '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

.이 예의 문제점은 및 ,및 기타 단어 구분 기호에 대해서도 동일한 작업을 수행해야 한다는 것입니다 . 다음과 같은 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

이는 예를 들어 sedOS X/macOS와 함께 제공되는 에서 작동합니다.


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

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

관련 정보