Dividir e concatenar (criar argumentos de linha de comando a partir do arquivo de entrada)

2

Como concatenar texto de um arquivo de linhas no formato:

line1
line2
...

para obter resultados como

-o line1:1 -o line2:1 ...

Eu encontrei a solução como concatenar com um separador como este:

ds='cat list.txt'
${ds//$'\n'/','}

Mas não consigo descobrir como adicionar prefixo a cada entrada.

    
por wikisky 19.10.2018 / 07:23

4 respostas

6

Isso depende do que você quer fazer com a string que você cria. Parece um conjunto de opções de linha de comando, então vou supor que você queira usá-lo como tal junto com algum utilitário chamado util .

Aqui está uma solução para /bin/sh :

#!/bin/sh

listfile=$1

set --
while IFS= read -r line; do
    set -- "$@" -o "$line:1"
done <$listfile

util "$@"

Isso lê o arquivo fornecido na linha de comando do script e, para cada linha lida nesse arquivo, ele define os parâmetros posicionais para incluir -o e LINE:1 , em que LINE é a linha lida do arquivo. .

Depois de ler todas as linhas, ele chama util com a lista construída de argumentos da linha de comando. Usando "$@" (com as aspas duplas), asseguramos que cada item individual na lista de argumentos construídos seja citado individualmente.

Com bash e usando uma matriz bash para manter os argumentos de linha de comando que criamos:

#!/bin/bash

listfile=$1

while IFS= read -r line; do
    args+=( -o "$line:1" )
done <$listfile

util "${args[@]}"

Em ambos os exemplos acima, a cotação é importante. Da mesma forma é o fato de criarmos uma matriz de itens separados (cada -o e cada LINE:1 são itens da lista). Outra maneira de fazer isso seria criar uma string única -o LINE1:1 -o LINE2:1 etc. , mas isso teria sido interpretado como um único argumento se usado como util "$string" e teria sofrido divisão de palavras e globalização de nome de arquivo se usado como util $string (isso não teria funcionado se alguma linha no arquivo de entrada contivesse espaços, tabulações ou caracteres de globalização de nome de arquivo).

Ambos os scripts acima seriam usados como

$ ./script.sh file

onde script.sh é o arquivo de script executável e file é o nome do arquivo de entrada para ler.

Relacionados:

por 19.10.2018 / 07:50
2

Com um shell recente (por exemplo, bash ), tente

mapfile -t TMP <file
TMP=(${TMP[@]/%/:1})
echo ${TMP[@]/#/-o }
-o line1:1 -o line2:1 -o line3:1
    
por 19.10.2018 / 12:37
1
sed 's/\(.*\)/-o :1/' file.txt | xargs /path/to/command

A substituição sed é lida como: substitua o texto em uma determinada linha por "-o the_original_text: 1". Em seguida, o comando xargs usa essas linhas de texto modificadas e concatena-as conforme apropriado para argumentos de linha de comando

    
por 19.10.2018 / 08:19
0

Arquivo de entrada:

line1
line2
line3

Comando:

perl -lpe '$\=" ";$_="-o $_:1"' input.txt

Comando alternativo:

awk '{ORS=":1 ";print"-o "$0}' input.txt

Saída (o mesmo para os dois comandos):

-o line1:1 -o line2:1 -o line3:1 
    
por 19.10.2018 / 16:33