Para cortar (truncar )cada línea del archivo (y tener la salida en la consola actual )use:
cut -c -80 infile # cut only counts bytes (fail with utf8)
grep -o '^.\{1,80\}' infile
sed 's/\(^.\{1,80\}\).*/\1/' infile
Si lo que desea es insertar una nueva línea en el carácter 80 y dividir cada línea de más de 80 caracteres en más líneas, use:
fold -w 80 infile # fold, like cut, counts bytes.
Si desea dividir solo en espacios (palabras completas ), use:
fold -sw 80 infile
Para todas las soluciones anteriores, redirija a algún otro archivo como>outfile
(no use el mismo nombre, eso no funcionará )al final de cualquier comando para almacenar el resultado en outfile
. Ejemplo:
fold -sw 80 infile > outfile
Вместо этого я бы предложил использовать ассоциативные массивы:
#! /bin/bash -
typeset -A dir log # declare both variables as associative arrays
dir=(
[family]=/home/family
[friends]=/home/friends
[pets]=/home/pets
)
log=(
[family]=/var/log/family.log
[friends]=/var/log/friends.log
[pets]=/var/log/pets.log
)
for type in "${!dir[@]}"
do
cat -- "${dir[$type]}/somefile" >> "${log[$type]}"
done
("${!array[@]}"
является синтаксисом ksh для получения списка ключей массива (в произвольном порядке )).
Или более разборчиво в zsh (, который имел ассоциативные массивы за десятилетия до bash):
#! /bin/zsh -
typeset -A dir log
dir=(
family /home/family
friends /home/friends
pets /home/pets
)
log=(
family /var/log/family.log
friends /var/log/friends.log
pets /var/log/pets.log
)
for type in ${(k)dir}
do
cat -- $dir[$type]/somefile >> $log[$type]
done
В ksh93 (, из которого bash позаимствовал синтаксис ассоциативного массива ), вы также могли использовать ассоциативные массивы составных переменных:
#! /bin/ksh93 -
conf=(
[family]=(dir=/home/family; log=/var/log/family.log)
[friends]=(dir=/home/friends; log=/var/log/friends.log)
[pets]=(dir=/home/pets; log=/var/log/pets.log)
)
for type in "${!conf[@]}"
do
cat -- "${conf[$type].dir}/somefile" >> "${conf[$type].log}"
done
Имея в виду предоставленные вами переменные и приведенный ниже код, вы получите то, что ищете. Я надеюсь, что это может помочь вам и другим сейчас и в будущем.
Баш Многострочный:
for TYPE in family friends pets
do
for FILE in $(eval echo "\$path_$TYPE/*")
do
cat $FILE >> $(eval echo "\$path_${TYPE}_log")
done
done
Одинарный вкладыш
for TYPE in family friends pets ;do for FILE in $(eval echo "\$path_$TYPE/*"); do cat $FILE >> $(eval echo "\$path_${TYPE}_log") ;done ; done