다음 문제를 해결하려고합니다. 정규식을 테스트하기 위해 Mac 터미널에서 다음과 같은 명령을 사용합니다.
echo 'inputstring' | sed (-E) '/s///g'
정규 표현식을 만들려고 합니다.
- 단어가 문자 "o"로 끝나는 경우에만 다음과 같습니다.
- 이 단어 끝에 있는 "o"를 삭제하세요.
- 단어에서 문자 "i"를 모두 "a"로 바꿉니다.
이 경우 입력 문자열은 다음 과 같 filo fililo felo fale
으며 예상되는 출력은 다음과 같습니다.fal falal fel fale
삭제 또는 교체를 수행하는 정규 표현식을 만들 수 있지만 이를 결합하는 방법을 잘 모르겠습니다. 조건부 부분 사이에 열 반을 넣으면 어떻게 넣는지 모르겠습니다.
또한 "단어 끝" 위치를 정의할 수도 없습니다. 사용해 \b
봤지만 작동하지 않는 것 같습니다( $
문자열 끝과 달리).
답변1
나는 이것을 사용하지 않을 것이지만 sed
이것이 학습 연습이라면 sed
다음과 같은 루프를 수행하십시오.
sed -E 's/$/ /
:a
s/i([[:alnum:]]*o[^[:alnum:]])/a\1/
ta
s/([[:alnum:]]*)o([^[:alnum:]])/\1\2/
ta
s/ $//'
- 첫 번째 줄에서는 줄 끝을 다른 단어 끝처럼 처리할 수 있도록 끝에 공백을 추가했습니다. 마지막 줄은 나중에 해당 공백을 제거합니다.
- 3행의 명령은
s
로 끝나는 단어를 검색하여 로 바꿉니다. 명령은 토큰으로 돌아가 모든 끝 단어의 모든 단어에 대해 이 작업을 반복합니다.i
o
a
t
:a
i
o
- 이제 다섯 번째 줄에서는 엔딩
o
과 또 다른 루프를 삭제합니다. 로 끝나는 단어는oo
모두 제거됩니다. 이것이 우리가 원하는 것인지 확실하지 않습니다.
참고로 저는 sed
command o
options 을 지원하는 버전을 사용하고 있으며 s
, 일치하는 부분만 유지하고 나머지는 버립니다. 또한 \h
교체 시 공간을 보존하는 콘텐츠로 교체하는 방법 도 알고 있습니다 . 이렇게 하면 작업이 간단해집니다.
sed -E ':a;h;s/([[:alnum:]]*)o($|[^[:alnum:]])/\1\2/o;T;y/i/a/;x;s//\h/;ba'
답변2
앗이 경우에는 더 정확하고 유연합니다.
awk '{ for(i=1;i<=NF;i++)
if ($i~/o$/) { sub(/o$/,"",$i); gsub("i","a",$i) } }1' <<<"filo fililo felo fale"
산출:
fal falal fel fale
선택하다파이썬명령줄 방법:
python -c 'import sys,re; s = sys.stdin.read().strip();
print(re.sub(r"\b(\S+)o\b", lambda m: m.group(1).replace("i","a"), s))' <<<"filo fililo felo fale"
fal falal fel fale
답변3
이것이 가능한지는 잘 모르겠지만 sed
(아마도 불가능할 것으로 생각됩니다) Python을 사용하면 정말 쉽습니다! 원하는 작업을 정확하게 수행하는 스크립트는 다음과 같습니다.
#!/usr/bin/env python2
# -*- coding: ascii -*-
"""modify_strings.py"""
import sys
import re
import fileinput
# Iterate over lines of input
# (either read from files or from stdin)
for line in fileinput.input():
# Split each line into tokens and preserve whitespace
tokens = re.split(r'(\s+)', line)
# Iterate over tokens
for token in tokens:
# If a word ends in 'o' then
# perform the desired transformation
if token.endswith('o'):
token = token[:-1].replace('i', 'a')
# Print out each token
sys.stdout.write(token)
다음과 같이 실행할 수 있습니다.
echo 'filo fililo felo fale' | python modify_strings.py
(필요에 따라) 다음과 같은 출력이 생성됩니다.
파 파 페어 파
정말로 참여하고 싶다면 sed
일부 쉘 스크립트로 기능을 향상시켜 원하는 것을 얻을 수 있을 것입니다. 이는 다음 bash
스크립트와 유사할 수 있습니다.
#!/usr/bin/env bash
# modify-strings.bash
for word in "$@"; do
if grep -q 'o$' <<<"${word}"; then
echo -n "${word} " | sed -e 's/i/a/g' -e 's/o$//';
else
echo -n "${word} ";
fi;
done
echo
다음과 같이 스크립트를 호출할 수 있습니다.
bash modify-strings.bash filo fililo felo fale