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