Можно ли выполнить команду над строкой, хранящейся внутри переменной?

Можно ли выполнить команду над строкой, хранящейся внутри переменной?

Привет, я сейчас пытаюсь выполнить следующий код. Я сохранил строку внутри переменной DATE в формате YYYY/MM/DD. Я пытаюсь извлечь год с помощью команды 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.

Чтобы получить первые четыре символа каждого файла в каталоге (в этом и заключается суть того, что яполагатьваш текущий код пытается сделать), вы можете использовать sedвот так:

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

Он считывает первую строку каждого файла, заменяет содержимое строки первыми четырьмя символами строки, а затем завершает работу после вывода результата на терминал.

решение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, что нужно использовать -в качестве разделителя
  • NR==1указать awk читать только первую строку каждого файла
  • {print $1}печатать только первое поле, разделенное разделителем

Связанный контент