linux - Agregue una nueva línea solo si no existe
bash sed (7)
sed
ÑU:
sed -i ''$a/' *.txt
OS X:
sed -i '''' ''$a/' *.txt
$
dirige a la última línea. a/
es la función de agregar.
Sed de OS X
sed -i '''' -n p *.txt
-n
desactiva la impresión p
imprime el espacio del patrón. p
agrega una nueva línea faltante en sed de OS X pero no en GNU sed, por lo que esto no funciona con GNU sed.
awk
awk 1
1
se puede reemplazar con cualquier cosa que se evalúe como verdadera. Modificar un archivo en su lugar:
{ rm file;awk 1 >file; }<file
intento
[[ $(tail -c1 file) && -f file ]]&&echo ''''>>file
Las líneas nuevas posteriores se eliminan del resultado de la sustitución del comando, por lo que $(tail -c1 file)
está vacío solo si el file
finaliza con un salto de línea o está vacío. -f file
es falso si el file
está vacío. [[ $x ]]
es equivalente a [[ -n $x ]]
en bash.
Quiero agregar una nueva línea al final de un archivo solo si no existe, esto es para evitar múltiples líneas nuevas al final del archivo.
Estoy esperando usar sed. Aquí están los problemas que estoy teniendo con mi código actual:
sed -i -e ''/^$/d;$G'' /inputfile
echo file1
name1
name2
echo file2
name3
name4
(newline)
cuando ejecuto mi código en los archivos;
echo file1
name1
name2
(newline)
echo file2
name3
name4
agrega una nueva línea si no tiene pero elimina si existe ... esto me desconcierta ...
Como elimina la nueva línea si no está allí, simplemente puede usar:
echo "" >> file; sed -ie ''/^$/d;$G'' file; sed -ie ''/^$/d;$G'' file
Agrega una nueva línea y elimina todo, luego agrega nueva línea. No es la manera elegante, pero ciertamente funciona :)
En lugar de procesar todo el archivo con solo ver para agregar una nueva línea al final, simplemente verifique el último carácter y, si no es una línea nueva, agregue uno. La prueba de nueva línea es un poco interesante, ya que el caparazón generalmente los recortará del final de las cadenas, así que añado "x" para protegerlo:
if [ "$(tail -c1 "$inputfile"; echo x)" != $''/nx'' ]; then
echo "" >>"$inputfile"
fi
Tenga en cuenta que esto agregará nueva línea a los archivos vacíos, que podrían no ser lo que usted desea. Si desea dejar archivos vacíos solo, agregue otra prueba:
if [ -s "$inputfile" ] && [ "$(tail -c1 "$inputfile"; echo x)" != $''/nx'' ]; then
echo "" >>"$inputfile"
fi
Intenta usar vi
o ex
:
ex -scwq foo.txt
o para múltiples archivos:
vi -es +"bufdo wq" *.txt
ex -s +"bufdo wq" *.txt
que automáticamente agrega EOL en EOF en el archivo guardado si falta.
Para solicitar ciertos archivos recursivamente, use una nueva opción globbing ( **
) como **/*.txt
shopt -s globstar
(enable by shopt -s globstar
).
Resolví esta tarea usando dos2unix
(o contrapartes) con el indicador --newline
. La ventaja es que estas herramientas detectan archivos binarios por sí mismos. Me gusta la solución con tail -c1
pero el filtrado de archivos binarios de antemano ha sido muy lento para mí.
dos2unix --newline my_file.txt
Eventualmente escribí un script que buscó en mi directorio de proyectos, convirtió todos los archivos a LF
( dos2unix
) excepto *.cmd
files ( CRLF
, unix2dos
) y usó la bandera para obtener las nuevas líneas a la derecha con una sola llamada.
Usando awk:
awk ''/^$/{f=1}END{ if (!f) {print "/r"}}1'' inputfile
Haga coincidir la línea en blanco ^$
(como lo hizo) y configure una bandera. Si el indicador no está establecido al final, coloque el carácter de nueva línea.
Nota: that /r
está en OS X. Use /n
para otro.
tail -c1 file | read -r _ || echo >> file
obtiene el último carácter del archivo en read
, que saldrá con un código de salida distinto de cero si encuentra EOF antes de nueva línea (por lo tanto, si el último carácter del archivo no es una nueva línea). Si la read
sale de un valor distinto de cero, agregue una nueva línea en el archivo usando echo
(si read
sale de 0, que satisface el ||
, por lo que el comando echo
no se ejecuta).
De http://backreference.org/2010/05/23/sanitizing-files-with-no-trailing-newline/ .