¿Cómo agrego una cadena después de cada línea en un archivo usando bash? ¿Se puede hacer usando el comando sed? Si es así, ¿cómo?
¿Cómo agrego una cadena después de cada línea en un archivo usando bash? ¿Se puede hacer usando el comando sed? Si es así, ¿cómo?
Respuestas:
Si su sed
permite la edición en el lugar a través del -i
parámetro:
sed -e 's/$/string after each line/' -i filename
Si no es así, tienes que hacer un archivo temporal:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
sed -e 's/^/string after each line/' -i filename
$ significa fin de línea. ^ significa comienzo de línea.
sed 's/^/string after each line/'
hace lo que esperaría (antepone a cada línea) pero sed 's/^/string after each line/'
no (reemplaza toda la línea con mi cadena de anexión). ¿Lo que da? ¿Alguna idea @TomDeGisi?
Prefiero usar awk
. Si solo hay una columna, use $0
, de lo contrario reemplácela con la última columna.
De una sola mano,
awk '{print $0, "string to append after each line"}' file > new_file
o esto,
awk '$0=$0"string to append after each line"' file > new_file
NR
variable:awk '{print $0, NR}'
sed 's/ //g'
esto funcionó para mi requisito, pero eliminará espacio en cada línea, esa es la opción g
para y en todas partes en una línea.
,
gusta {print $0"string to append after each line"}
.
Si lo tiene, la utilidad lam (laminado) puede hacerlo, por ejemplo:
$ lam filename -s "string after each line"
Cáscara POSIX pura y sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
y printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Usando join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Herramientas Shell usando paste
, yes
, head
y wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Tenga en cuenta que paste
inserta un carácter Tab antes $suffix
.
Por supuesto, sponge
se puede reemplazar con un archivo temporal, luego mv
'd sobre el nombre del archivo original, como con algunas otras respuestas ...
sed
, a menos que los recursos sean muy limitados.
sed
no es necesario para un trabajo tan sencillo.
Yo prefiero echo
. usando puro bash:
cat file | while read line; do echo ${line}$string; done
Sed es un poco feo, podrías hacerlo elegantemente así:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo
; haz eco de la barra $ {i}; hecho foobar barbar bazbar pero después de algunas pruebas, podría estar equivocado sobre mi razonamiento, pero Dennis tiene razón
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
que imprime 2 líneas aunque la entrada sea 1 línea foo bar
(y cat
leer desde stdin en lugar de un archivo no hace ninguna diferencia en esto).
touch
el archivo temporal? Ysed
condicionaría el comando al éxito delcp
o podría perderse el original.