(sed) 정규식을 사용하여 마지막 문자를 제거하면서 문자의 모든 항목을 바꾸는 방법은 무엇입니까?

(sed) 정규식을 사용하여 마지막 문자를 제거하면서 문자의 모든 항목을 바꾸는 방법은 무엇입니까?

다음 문제를 해결하려고합니다. 정규식을 테스트하기 위해 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로 끝나는 단어를 검색하여 로 바꿉니다. 명령은 토큰으로 돌아가 모든 끝 단어의 모든 단어에 대해 이 작업을 반복합니다.ioat:aio
  • 이제 다섯 번째 줄에서는 엔딩 o과 또 다른 루프를 삭제합니다. 로 끝나는 단어는 oo모두 제거됩니다. 이것이 우리가 원하는 것인지 확실하지 않습니다.

참고로 저는 sedcommand ooptions 을 지원하는 버전을 사용하고 있으며 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

관련 정보