Quero acrescentar texto ao arquivo como echo "abc" >>file.txt
.
Mas isso adiciona abc
após nova linha
Como posso adicionar abc
no final do arquivo com eco sem nova linha?
shell
text-processing
io-redirection
echo
choijj
fonte
fonte
abc
sem uma nova linha final, que (depois de ler sua pergunta com atenção) não parece ser o que você deseja.Respostas:
echo "abc" >>file.txt
coloca uma nova linha depoisabc
, não antes. Se você terminar comabc
sua própria linha, isso significa que a nova linha anteriorabc
já estava presentefile.txt
.Observe que é perfeitamente normal que um arquivo de texto termine em uma nova linha. No unix, uma linha consiste em uma sequência de caracteres que não seja ⁰ ou nova linha seguida por uma nova linha. 1 Portanto, qualquer arquivo de texto não vazio termina com um caractere de nova linha.
Se você deseja adicionar texto à última linha de um arquivo, não pode fazê-lo
>>
, porque isso sempre se anexa ao arquivo e, portanto, sempre é gravado após a última nova linha. Em vez disso, você precisa de uma ferramenta capaz de modificar um arquivo existente. Por exemplo, você pode usar sed :No comando sed, o primeiro
$
significa "execute o seguinte comando apenas na última linha", o comandos/REGEX/REPLACEMENT/
substitui REGEX por REPLACEMENT, e a expressão regular$
corresponde no final da linha.O comando sed do Linux possui um recurso interno para automatizar essa sequência de criação de novo arquivo e substituição, para que você possa reduzi-lo para
⁰ Esse é um byte nulo, que ASCII chama NUL e Unicode chama U + 0000. Os programas de processamento de texto podem ou não lidar com esse caractere.
1 Consulte as definições de arquivo de texto , linha e caractere de nova linha na seção "Definições" do capítulo Definições de base da IEEE 1003.1-2008: 2016.
fonte
0x41
(ASCII'A'
), tecnicamente não será mais um arquivo de texto? Nesse caso, sugiro enfatizar esse ponto, já que é uma definição pouco intuitiva; caso contrário, uma pequena alteração na redação pode ajudar a evitar a confusão.Eu não acho que é possível com o
echo
comando, use a seguintesed
abordagem:-i
- modificar o arquivo no local$
- indica o último registro / linhas/$/abc/
- substitua o final da linha$
por substringabc
(para o último registro)fonte
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
Supondo que o arquivo ainda não termine em uma nova linha e você simplesmente queira acrescentar mais texto sem adicionar um, você pode usar o
-n
argumento, por exemploNo entanto, alguns sistemas UNIX não fornecem essa opção; se for esse o caso, você pode usar
printf
, por exemplo(o
%s
argumento inicial é proteger contra o texto adicional com%
caracteres de formatação)De
man echo
(no macOS High Sierra):fonte
echo -n
não colocaria nenhuma nova linha no final deabc
, masabc
ainda seria precedida por uma nova linha, que é o que o usuário deseja evitar.\n
não aparecesse em primeiro lugar. Mais opções são melhores, especialmente quando elas não envolvem a necessidade de reescrever o arquivo inteiro toda vez que ocorre uma alteração (que pode ficar bastante lenta e ser executada em tempo polinomial, se for feita repetidamente).Se você possui o
truncate
comando e seu arquivo de texto tem NL como último caractere, você pode removê-lo e anexá-lo da seguinte maneira:(Observe que
truncate
nada se importa com o conteúdo do arquivo e, neste exemplo, simplesmente reduz o tamanho do arquivo em um byte. Se o seu último caractere não for um único byte, ou seja, é um caractere "amplo" de vários bytes, você apresentará corrupção.)fonte
O que você deseja é adicioná-lo no final da última linha, logo antes do delimitador dessa última linha, logo antes do último caractere do arquivo.
Com
ksh93
, você pode fazer:Onde
1<>
está o operador padrão para abrir um arquivo no modo de leitura + gravação (e mais importante sem truncamento ) no stdout e>#((...))
é um operador de busca específico do ksh93 (aqui para procurar antes do último byte). Observe queecho
escreveabc<newline>
ondea
substitui a nova linha existente eecho
adiciona sua própria nova linha.O
zsh
equivalente:Embora, para obter um equivalente mais exato, você também precise imprimir uma mensagem de erro quando não conseguir:
fonte
Provavelmente um UUOC, mas você também pode:
Como Gilles aponta, este comando é limitado:
Além disso, tenha cuidado ao usar
cat
arquivos que você não conhece:Conclusão :
Use sed
fonte
echo
: pcat
, mas a problemas com sequências de escape arbitrárias sendo enviadas para o terminal.