문제

다음과 같은 형식의 파일 이름이 있습니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top