
텍스트 패턴 내부의 숫자 값을 대체하는 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