변수 내에 저장된 문자열에 대해 명령을 수행할 수 있습니까?

변수 내에 저장된 문자열에 대해 명령을 수행할 수 있습니까?

안녕하세요 현재 다음 코드를 실행하려고 합니다. YYYY/MM/DD 형식의 DATE 변수 안에 문자열을 저장했습니다. cut 명령을 사용하여 연도를 추출하려고 합니다. 파일이나 디렉터리가 아니라는 오류 메시지가 나타납니다. 수정하거나 다른 방법으로 할 수 있나요?

for file in ~/filesToSort/*
do

   DATE=$(head -1 $file | tr "-" "/")
   echo "${DATE}"
   YYYY=$(cut -c1-4 accounts $DATE)
   #echo "${YYYY}"
done

감사해요

답변1

유틸리티 cut는 표준 입력 스트림에서 데이터를 읽지만 인수로 제공된 문자열에서는 작동하지 않습니다.

따라서 를 사용하려면 cut표준 입력으로 데이터를 전달해야 합니다.

YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )

그러나 루프에서는 속도가 매우 느립니다. 대신 내장된 매개변수 대체를 사용하여 문자열 /의 첫 번째 이후의 모든 항목을 삭제하세요 $DATE.

YYYY=${DATE%%/*}

$DATE이는 쉘 패턴과 일치하는 가장 긴 접미사 문자열을 제거합니다 /*. 문자열이 2021/10/21이면 를 반환합니다 2021.

디렉토리에 있는 모든 파일의 처음 4자를 얻으려면(이것이 제가 설명한 내용의 핵심입니다.)믿다현재 코드가 시도하고 있는 경우) sed다음과 같이 사용할 수 있습니다.

for name in "$HOME"/filesToSort/*; do
    sed -e 's/\(....\).*/\1/' -e q "$name"
done

이는 각 파일의 첫 번째 줄을 읽고 줄의 내용을 줄의 처음 4개 문자로 바꾼 다음 결과를 터미널에 출력한 후 종료됩니다.

답변2

<<<쉘이 이를 지원하는 경우 이를 위해 Here Strings( )를 사용할 수 있습니다 . 에서 man bash:

Here Strings
       A variant of here documents, the format is:

              [n]<<<word

       The word undergoes tilde expansion, parameter and variable  expansion,
       command  substitution, arithmetic expansion, and quote removal.  Path‐
       name expansion and word splitting are not performed.   The  result  is
       supplied  as  a single string, with a newline appended, to the command
       on its standard input (or file descriptor n if n is specified).

귀하의 경우에는 다음을 수행합니다.

for file in ~/filesToSort/*
do

   date=$(head -1 "$file" | tr "-" "/")
   echo "${DATE}"
   yyy=$(cut -c1-4 <<< "$date")
   echo "$yyy"
done

답변3

좋은 올레를 사용하는 또 다른 방법awk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-'-awk에게 the를 구분 기호로 사용하라고 지시합니다.
  • NR==1awk에게 모든 파일의 첫 번째 줄만 읽도록 지시하세요.
  • {print $1}구분 기호로 구분된 첫 번째 필드만 인쇄합니다.

관련 정보