Bash에서 파일 이름을 어떻게 구문 분석합니까?
문제
다음과 같은 형식의 파일 이름이 있습니다.
system-source-yyyymmdd.dat
"-"를 구분 기호로 사용하여 파일 이름의 다른 부분을 구문 분석할 수 있기를 바랍니다.
해결책
당신은 사용할 수 있습니다 잘라내기 명령 3개의 '필드' 각각에 도달하려면 다음과 같이 하세요.
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d"는 구분 기호를 지정하고, "-f"는 필요한 필드 수를 지정합니다.
다른 팁
내장 기능만 사용하는 멋지고 우아한(내 생각에는 :-) 배열에 넣는 것입니다.
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
그런 다음 배열에서 부품을 찾을 수 있습니다.
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
경고:파일 이름에 공백이나 천국 금지, 따옴표, 역따옴표와 같은 "이상한" 문자가 포함되어 있으면 작동하지 않습니다.
귀하의 필요에 따라, 앗 컷보다 유연합니다.첫 번째 티저:
# echo "system-source-yyyymmdd.dat" \
|awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
$1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd
문제는 awk를 '더 유연하다'고 표현하는 것은 확실히 iPhone을 향상된 휴대폰이라고 부르는 것과 같다는 것입니다 ;-)
사용 cut
명령.
예를 들어
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
첫 번째 비트를 추출합니다.
값을 변경합니다. -f
매개변수를 사용하여 적절한 부품을 가져옵니다.
다음은 자르다 명령.
또 다른 방법은 쉘의 내부 구문 분석 도구를 사용하는 것입니다. 이를 통해 하위 프로세스 생성 비용을 피할 수 있습니다.
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
이를 수행하는 가장 간단한(및 IMO 가장 좋은 방법)은 다음을 사용하는 것입니다. read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
해당 테마에는 다양한 변형이 있으며 그 중 다수는 셸에 따라 다릅니다.
bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat
echo "$name" | { IFS=-. read system source date ext
echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here