linux bash sed newline

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/ .