Usando uma ferramenta de linha de comando comum como sed ou awk, é possível juntar todas as linhas que terminam com um determinado caractere, como uma barra invertida?
Por exemplo, dado o arquivo:
foo bar \
bash \
baz
dude \
happy
Gostaria de obter esta saída:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Cory Klein
fonte
fonte
cpp
:)sed
FAQRespostas:
uma solução sed mais curta e mais simples:
ou one-liner se estiver usando o GNU
sed
:fonte
sed
:) ... Você está anexando cada linha diretamente ao espaço do padrão e, quando uma linha "normalmente terminada" aparece, o todo o espaço do padrão cai e é impresso automaticamente (porque não existe a opção -n) ... limpo! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
É possivelmente mais fácil com o perl (já que o perl é como sed e awk, espero que seja aceitável para você):
fonte
Aqui está uma solução awk. Se uma linha terminar com a
\
, retire a barra invertida e imprima a linha sem nova linha final; caso contrário, imprima a linha com uma nova linha final.Também não é tão ruim no sed, embora o awk seja obviamente mais legível.
fonte
Esta não é uma resposta como tal. É uma questão paralela
sed
.Especificamente, eu precisava
sed
desmontar o comando de Gilles, peça por peça, para entendê-lo ... Comecei a escrever algumas anotações e achei que poderia ser útil aqui para alguém ...então aqui está ... o script sed de Gilles em formato documentado :
fonte
Ainda outra ferramenta de linha de comando comum seria
ed
, que por padrão modifica os arquivos no local e, portanto, deixa as permissões de arquivo inalteradas (para obter mais informações sobreed
consulte Editando arquivos com o editor de texto a partir de scripts )fonte
Usando o fato de que
read
no shell interpretará barras invertidas quando usadas sem-r
:Observe que isso também interpretará qualquer outra barra invertida nos dados.
fonte
a\\b\\\\\\\\\\\c
Uma solução simples (r) que carrega o arquivo inteiro na memória:
Ou uma ainda curta que funciona para entender as linhas (de saída) (sintaxe GNU):
Em uma linha (sintaxe POSIX):
Ou use o awk (se o arquivo for muito grande para caber na memória):
fonte
A versão para Mac baseada na solução @Giles ficaria assim
Onde a principal diferença é como as novas linhas são representadas, e a combinação adicional de uma linha quebra-a
fonte
Você pode usar o cpp, mas ele produz algumas linhas vazias onde mesclou a saída e algumas introduções que removo com o sed - talvez isso também possa ser feito com as opções e opções do cpp:
fonte
cpp
é uma solução? No seu exemplo, aecho
string with entre aspas duplas já gera texto corrigido, portanto,cpp
é inútil. (Isso também se aplica ao seused
código.) Se você colocar a string entre aspascpp
simples , apenas remove as barras invertidas, mas não concatena as linhas. (A concatenação comcpp
funcionaria se não haveria espaço antes as barras invertidas, mas então as palavras separadas seriam unidas sem separadores.)cpp
assim ainda não concatena as linhas para mim. E o uso desed
é definitivamente desnecessário. Usecpp -P
: “-P
geração de Inibição de linemarkers na saída do pré-processador.” - homem CPPcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Acpp --version
revelacpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
- o que? O Ubuntu está corrigindo o cpp? Por quê? Eu esperava ler GNU ...cpp
fato concatena as linhas e deixa alguns espaços em branco. Ainda mais interessante, a mesma versão 4.4.3-4ubuntu5.1 aqui aceita-P
. No entanto, apenas elimina os marcadores de linha, as linhas vazias permanecem.