lineas - sed shell
Cómo eliminar los espacios en blanco al final con sed? (9)
Al menos en Mountain Lion, la respuesta de Viktor también eliminará el carácter ''t'' cuando esté al final de una línea. Las siguientes soluciones a ese problema:
sed -i '''' -e''s/[[:space:]]*$//'' "$1"
Tengo un script de shell simple que elimina los espacios en blanco finales de un archivo. ¿Hay alguna forma de hacer este script más compacto (sin crear un archivo temporal)?
sed ''s/[ /t]*$//'' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
Gracias a codaddict por sugerir la opción -i
.
El siguiente comando resuelve el problema en Snow Leopard
sed -i '''' -e''s/[ /t]*$//'' "$1"
Lo mejor es también citar $ 1:
sed -i.bak ''s/[[:blank:]]*$//'' "$1"
Para aquellos que buscan la eficiencia (muchos archivos para procesar, o archivos grandes), usar el operador +
repetición en lugar de *
hace que el comando sea más de dos veces más rápido.
Con GNU sed:
sed -Ei ''s/[ /t]+$//'' "$1"
sed -i ''s/[ /t]/+$//'' "$1" # The same without extended regex
También califiqué rápidamente otra cosa: usar [ /t]
lugar de [[:space:]]
también acelera significativamente el proceso (GNU sed v4.4):
sed -Ei ''s/[ /t]+$//'' "$1"
real 0m0,335s
user 0m0,133s
sys 0m0,193s
sed -Ei ''s/[[:space:]]+$//'' "$1"
real 0m0,838s
user 0m0,630s
sys 0m0,207s
sed -Ei ''s/[ /t]*$//'' "$1"
real 0m0,882s
user 0m0,657s
sys 0m0,227s
sed -Ei ''s/[[:space:]]*$//'' "$1"
real 0m1,711s
user 0m1,423s
sys 0m0,283s
Para quitar espacios en blanco (en mi caso, espacios y pestañas) de líneas con al menos un carácter que no sea de espacio en blanco (de esta manera, las líneas vacías no se tocan):
sed -i -r ''s/([^ /t]+)[ /t]+$//1/'' "$file"
Puede usar la opción in-situ de sed
para Linux y Unix:
sed -i ''s/[ /t]*$//'' "$1"
Tenga en cuenta que la expresión eliminará las t
posteriores en OSX (puede usar gsed
para evitar este problema). Puede eliminarlos en BSD también.
Si no has gsed, aquí está la sintaxis sed correcta (pero difícil de leer) en OSX:
sed -i '''' -E ''s/[ ''$''/t'''']+$//'' "$1"
Tres cadenas de comillas simples finalmente se concatenan en un único argumento / expresión. No hay un operador de concatenación en bash, simplemente coloque cadenas una tras otra sin espacio entre ellas.
El $''/t''
resuelve como un carácter de tabulación literal en bash (usando el método de cita ANSI-C ), por lo que la pestaña se concatena correctamente en la expresión.
Solo por diversión:
#!/bin/bash
FILE=$1
if [[ -z $FILE ]]; then
echo "You must pass a filename -- exiting" >&2
exit 1
fi
if [[ ! -f $FILE ]]; then
echo "There is not file ''$FILE'' here -- exiting" >&2
exit 1
fi
BEFORE=`wc -c "$FILE" | cut --delimiter='' '' --fields=1`
# >>>>>>>>>>
sed -i.bak -e''s/[ /t]*$//'' "$FILE"
# <<<<<<<<<<
AFTER=`wc -c "$FILE" | cut --delimiter='' '' --fields=1`
if [[ $? != 0 ]]; then
echo "Some error occurred" >&2
else
echo "Filtered ''$FILE'' from $BEFORE characters to $AFTER characters"
fi
Tengo un script en mi .bashrc que funciona bajo OSX y Linux (solo bash!)
function trim_trailing_space() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will trim (in place) trailing spaces in the given file (remove unwanted spaces at end of lines)"
echo "Usage :"
echo "$FUNCNAME file"
return
fi
local file=$1
unamestr=$(uname)
if [[ $unamestr == ''Darwin'' ]]; then
#specific case for Mac OSX
sed -E -i '''' ''s/[[:space:]]*$//'' $file
else
sed -i ''s/[[:space:]]*$//'' $file
fi
}
a lo que agrego:
SRC_FILES_EXTENSIONS="js|ts|cpp|c|h|hpp|php|py|sh|cs|sql|json|ini|xml|conf"
function find_source_files() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will list sources files (having extensions $SRC_FILES_EXTENSIONS)"
echo "Usage :"
echo "$FUNCNAME folder"
return
fi
local folder=$1
unamestr=$(uname)
if [[ $unamestr == ''Darwin'' ]]; then
#specific case for Mac OSX
find -E $folder -iregex ''.*/.(''$SRC_FILES_EXTENSIONS'')''
else
#Rhahhh, lovely
local extensions_escaped=$(echo $SRC_FILES_EXTENSIONS | sed s//|//////|/g)
#echo "extensions_escaped:$extensions_escaped"
find $folder -iregex ''.*/./(''$extensions_escaped''/)$''
fi
}
function trim_trailing_space_all_source_files() {
for f in $(find_source_files .); do trim_trailing_space $f;done
}
var1="/t/t Test String trimming "
echo $var1
Var2=$(echo "${var1}" | sed ''s/^[[:space:]]*//;s/[[:space:]]*$//'')
echo $Var2