
나는 정규식과 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
지원되지 않으면 다른 조치를 취해야 합니다. 이는 영숫자가 아닌 문자 또는 줄 끝이 뒤따르는 것과 일치합니다 .\<
\>
\b
o
$ 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