우리 회사에서 사용할 수 있는 호스트 이름 목록이 있습니다.
예를 들어:
- 구스와스트 03
- gkjbossp1
- frdwop04
숫자 앞의 마지막 문자인 은(는 t
) p
호스트 q
환경을 나타냅니다. 모든 문자열은 숫자로 끝납니다.
t
시험용p
제품에 대한q
품질 보증을 위해
호스트 이름과 숫자로 이어지는 문자를 얻으려면 정규식이 필요합니다. (파일에 모두 나열하지 않고 단일 문자열에 대한 솔루션이 필요합니다.)
예를 들어:
크바스티03
이 문자열에서는 문자만 추출하고 싶습니다 t
.
미리 감사드립니다.
답변1
grep
질문에 and 로 태그를 지정했으므로 sed
문자열 목록이 일부 텍스트 입력의 한 줄에 하나의 항목으로 표시된다고 가정합니다.
그 다음에:
sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input
또는 (GNU grep
또는 호환 빌드에 Perl과 유사한 정규식 지원이 있다고 가정):
grep -Po '\D(?=\d+$)' < that-input
숫자가 아닌 문자로 끝나는 행의 후행 숫자 앞에 숫자가 아닌 문자를 출력하고 그 뒤에 하나 이상의 숫자가 나옵니다.
둘 다 일치를 위해 정규식을 사용하지만 sed
기본 정규식과 grep -P
Perl과 유사한 정규식을 사용합니다.
일부 sed
구현에서는 -P
이를 지원하지만 가장 일반적이지는 않습니다. -E
정규식의 또 다른 방언인 확장 정규식에 대한 다양한 지원 . 그리고 그것들:
sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input
아니면 그냥 perl
단독으로 사용할 수도 있습니다:
perl -lne 'print $1 if /(\D)\d+$/' < that-input
( perl
기본적으로 문자 수준이 아닌 바이트 수준에서 작동합니다. 입력을 UTF-8 문자로 해석하거나 일반적 으로 그렇듯이 로케일 인코딩에 따라 입력/출력을 디코딩/인코딩하도록 -C
지시하는 옵션을 참조하세요.) .-Mopen=locale
grep
sed
또는 libpcre(GNU에서 사용하는 라이브러리)와 함께 제공되는 예제 구현 pcregrep
:grep
grep -P
pcregrep -o1 '(\D)\d+$' < that-input
답변2
일반 배쉬로
shopt -s extglob
for host in "${hosts[@]}"; do
tmp=${host%%+([[:digit:]])} # strip the trailing digits
echo "$host => ${tmp: -1}" # extract the last character
done
gswast03 => t
gkjbossp1 => p
frdwop04 => p
또는 정규식 일치를 사용하십시오.
for host in "${hosts[@]}"; do
if [[ $host =~ ([^[:digit:]])[[:digit:]]+$ ]]; then
echo "$host => ${BASH_REMATCH[1]}"
fi
done
답변3
.*([pqt])\d+$
뒤에 ap, q 또는 t와 하나 이상의 숫자가 오는 모든 문자와 일치합니다. 일치 그룹은 귀하가 관심을 갖는 개별 문자입니다.
답변4
이는 모든 UNIX 시스템의 모든 셸에 있는 모든 sed에서 작동합니다.
$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q
위의 내용은 이 입력 파일에 대해 실행되었습니다.
$ cat file
gswast03
gkjbossp1
frdwoq04