¿Es posible ejecutar un comando en una cadena almacenada dentro de una variable?

¿Es posible ejecutar un comando en una cadena almacenada dentro de una variable?

Hola, actualmente estoy intentando ejecutar el siguiente código. He almacenado una cadena dentro de la variable FECHA que tiene el formato AAAA/MM/DD. Estoy intentando extraer el año usando el comando cortar. Recibo un error que indica que no es un archivo o directorio. ¿Hay alguna modificación que pueda hacer o alguna forma diferente de hacerlo?

for file in ~/filesToSort/*
do

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

Gracias

Respuesta1

La cututilidad lee datos de su flujo de entrada estándar, no opera con cadenas dadas como argumentos.

Por lo tanto, para utilizar cut, debe pasar los datos en la entrada estándar:

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

Sin embargo, eso sería muy lento en un bucle. En su lugar, utilice una sustitución de parámetros incorporada para eliminar todo lo que sigue al primero /de la $DATEcadena:

YYYY=${DATE%%/*}

Esto elimina la cadena de sufijo más larga $DATEque coincida con el patrón de shell /*. Si la cadena es 2021/10/21, entonces esto devuelve 2021.

Para obtener los primeros cuatro caracteres de cada archivo en un directorio (que es la esencia de lo quecreersu código actual está intentando hacer), podría usar sedasí:

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

Esto lee la primera línea de cada archivo, reemplaza el contenido de la línea con los primeros cuatro caracteres de la línea y luego sale después de enviar el resultado a la terminal.

Respuesta2

Si su shell lo admite, puede usar Here Strings ( <<<) para esto. De 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).

En tu caso harías:

for file in ~/filesToSort/*
do

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

Respuesta3

Otra forma más de utilizar el buen oleawk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-'le dice a awk que use -como delimitador
  • NR==1decirle a awk que lea solo la primera línea de cada archivo
  • {print $1}imprimir solo el primer campo separado por el delimitador

información relacionada