bash glob의 확장된 부분만 반환 [중복]

bash glob의 확장된 부분만 반환 [중복]

내 디렉토리에 hesa1.c 및 hesa2.c 파일이 포함되어 있다고 가정해 보겠습니다. 다음 bash 스크립트

#!/bin/bash
for j in hes*.c
do
echo $j
done

hesa1.c와 hesa2.c를 반환합니다.

이 bash 스크립트가 a1 및 a2만 반환하도록 하려면 어떻게 해야 합니까(즉, 와일드카드 확장의 용도)?

답변1

이것은 "와일드카드 확장만 표시"와 같은 완전히 일반적인 대답은 아니지만 쉘의매개변수 확장 기능글로브의 고정 부분을 제거합니다.

j=${j#hes}
echo ${j%.c}

이렇게 하면 처음에 고정된 "hes"가 제거 j되고 끝에서 고정된 ".c"가 제거됩니다 j.

답변2

Stephen의 쉘 기반 접근 방식아마도 가장 간단할 수도 있지만 다음과 같은 것을 사용할 수도 있습니다 sed.

for j in hes*.c
do
    printf '%s\n' "$j" | sed -E 's/^hes(.*)\.c$/\1/'
done

답변3

printf다음은 배열을 사용하고 분할할 수 있는 또 다른 방법 입니다 .

for f in hes*; do printf '%s\n' "${f[@]:3:-2}"; done

또한 PE를 사용하여:

for f in hes*; do tmp="${f%.c}"; printf '%s\n' "${tmp:3}"; done

답변4

하나가 존재한다고 가정하면 *Perl 스크립트를 작성하여 expandstar확장 할 수 있습니다.

#!/usr/bin/perl
my $a=shift;                               ## a='he*.c'  for example
my $b=($a=~s/\*/(.*)/gr);                  ## b='he(.*).c'
for( glob($a)){                            ## for all files matching a
   print s/$b/$1/r ,"\n"                   ##   print after substituting
}

용법:

$ expandstar 'he*.c'                       ## dont forget '...'
sa1
sa2

온라인 사용자를 선호한다면(안타깝지만):

perl -E '$a=$b=shift; $b=~s/\*/(.*)/; say s/$b/$1/r for glob($a)' 'he*.c'

관련 정보