¿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?
112
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
touchel archivo temporal? Ysedcondicionaría el comando al éxito delcpo podría perderse el original.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) perosed '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,
o esto,
fuente
NRvariable:awk '{print $0, NR}'sed 's/ //g'esto funcionó para mi requisito, pero eliminará espacio en cada línea, esa es la opcióngpara 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:
fuente
Cáscara POSIX pura y
sponge:xargsyprintf:Usando
join:Herramientas Shell usando
paste,yes,headywc:Tenga en cuenta que
pasteinserta un carácter Tab antes$suffix.Por supuesto,
spongese puede reemplazar con un archivo temporal, luegomv'd sobre el nombre del archivo original, como con algunas otras respuestas ...fuente
sed, a menos que los recursos sean muy limitados.sedno es necesario para un trabajo tan sencillo.Yo prefiero
echo. usando puro bash:fuente
Sed es un poco feo, podrías hacerlo elegantemente así:
fuente
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ónecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)que imprime 2 líneas aunque la entrada sea 1 líneafoo bar(ycatleer desde stdin en lugar de un archivo no hace ninguna diferencia en esto).