¿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 sedpermite la edición en el lugar a través del -ipará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
NRvariable:awk '{print $0, NR}'
sed 's/ //g'esto funcionó para mi requisito, pero eliminará espacio en cada línea, esa es la opción gpara 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 filexargsy printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileUsando join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileHerramientas Shell usando paste, yes, head
y wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Tenga en cuenta que pasteinserta un carácter Tab antes $suffix.
Por supuesto, spongese 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.
sedno 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 catleer desde stdin en lugar de un archivo no hace ninguna diferencia en esto).
touchel archivo temporal? Ysedcondicionaría el comando al éxito delcpo podría perderse el original.