Como adiciono uma string após cada linha em um arquivo usando o bash? Isso pode ser feito usando o comando sed, se sim, como?
Como adiciono uma string após cada linha em um arquivo usando o bash? Isso pode ser feito usando o comando sed, se sim, como?
Respostas:
Se você sed
permitir a edição no local por meio do -i
parâmetro:
sed -e 's/$/string after each line/' -i filename
Caso contrário, você deve fazer um arquivo temporário:
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 fim de linha. ^ significa início da linha.
sed 's/^/string after each line/'
faz o que eu esperava (adiciona cada linha), mas sed 's/^/string after each line/'
não (substitui toda a linha pela minha string anexada). O que da? Alguma ideia @TomDeGisi?
Eu prefiro usar awk
. Se houver apenas uma coluna, use $0
, do contrário, substitua-a pela última coluna.
Mão única,
awk '{print $0, "string to append after each line"}' file > new_file
ou isto,
awk '$0=$0"string to append after each line"' file > new_file
NR
variável:awk '{print $0, NR}'
sed 's/ //g'
isso funcionou para minhas necessidades, mas irá remover espaço em todas as linhas, essa é a opção g
para e em todos os lugares em uma linha.
,
gosto {print $0"string to append after each line"}
.
Se você tiver, o utilitário lam (laminado) pode fazer isso, por exemplo:
$ lam filename -s "string after each line"
Casca POSIX pura e sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
e 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
Ferramentas Shell usando paste
, yes
, head
e wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Observe que paste
insere um caractere Tab antes $suffix
.
Claro que sponge
pode ser substituído por um arquivo temporário, depois mv
sobre o nome do arquivo original, como acontece com algumas outras respostas ...
sed
, a menos que os recursos sejam muito limitados.
sed
não é necessário para um trabalho tão simples.
Eu prefiro echo
. usando bash puro:
cat file | while read line; do echo ${line}$string; done
Sed é um pouco feio, você poderia fazer isso elegantemente assim:
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
; faça echo $ {i} bar; feito foobar barbar bazbar, mas depois de alguns testes, posso estar errado sobre meu raciocínio, mas Dennis está certo
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
que imprime 2 linhas mesmo que a entrada seja 1 linha foo bar
(e cat
ler de stdin ao invés de um arquivo não faz diferença para isso).
touch
o arquivo temporário? E eu tornaria osed
comando condicional ao sucesso docp
ou o original poderia ser perdido.