¿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 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
touch
el archivo temporal? Ysed
condicionaría el comando al éxito delcp
o 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
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óng
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:
fuente
Cáscara POSIX pura y
sponge
:xargs
yprintf
:Usando
join
:Herramientas Shell usando
paste
,yes
,head
ywc
:Tenga en cuenta que
paste
inserta un carácter Tab antes$suffix
.Por supuesto,
sponge
se 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.sed
no 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
(ycat
leer desde stdin en lugar de un archivo no hace ninguna diferencia en esto).