내 디렉토리에 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'