Bash: 대체 정규 표현식

Bash: 대체 정규 표현식

텍스트 패턴 내부의 숫자 값을 대체하는 bash 스크립트가 있습니다. 다음과 같은 파일이 있다고 가정합니다.

word5word
word55word

그리고 나는 이것이 다음과 같이 보이길 원합니다:

word125word
word125word

이를 수행하는 스크립트는 다음과 같습니다.

#!/bin/bash

re='([0-9]|[0-9][0-9])'
while read line
  do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
  done < /home/tomak/test.txt

어떤 이유로 're' 표현식이 올바르게 해석되지 않고 원래 줄을 인쇄합니다. 이유를 알 수 없습니다. 이는 한 자리 숫자(예: )에 대해 작동합니다 re='[0-9]'.

표현을 공식화하기 위해 나는 다음의 정보를 사용했습니다.초보자를 위한 배쉬 가이드이는 다음과 같이 말합니다.

두 개의 정규 표현식은 중위 연산자 "|"로 결합될 수 있습니다. 결과 정규식은 하위 표현식과 일치하는 모든 문자열과 일치합니다.

하지만 그것은 나에게 효과가 없습니다. 내가 무엇을 놓치고 있나요?

shopt -s extglob다음 과 같은 표현식을 설정하고 공식화하려고 시도했지만 [0-9][0-9]?그 역시 작동하지 않았습니다.

저는 Ubuntu 14.10을 사용하고 있으며 기본 bash 버전 4.3.30을 사용하고 있습니다. 으로 스크립트를 실행합니다 bash foo.sh.

답변1

매개변수 확장 대체는 정규 표현식에서 작동하지 않습니다. extglob여기서는 도움이 될 수 있지만 정규 표현식에서는 작동하지 않습니다.

아래 표현식의 올바른 구문 extglob은 다음과 같습니다.

re='+([0-9])'

즉, 숫자가 한 번 이상입니다.

시험:

re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
done

산출:

word125word
word125word

답변2

단지 패턴으로 대체하는 경우 bash 대신 sed 또는 perl을 제안합니다.

sed -e 's/word[0-9]\+word/word125word/g' /home/tomak/test.txt

또는

perl -pe 's/word\d+word/word125waord/g' /home/tomak/test.txt

관련 정보