Manipulação de espaço de string customizada com sed

6

O seguinte comando:

head -n 1 $FILE | tail -n 1

Puxa o texto da linha um de $FILE . O formato de cada linha em $FILE é o seguinte:

1 2 3 4  2 3  3 4 5  4 5 6 7 8 9

Como você pode ver, cada caractere é separado por um único espaço. Cada grupo é separado por dois espaços. Usando sed , preciso remover os espaços simples e converter os espaços duplos em espaços únicos.

O texto em $FILE é criado por um loop for aninhado dentro de outro para loop. Portanto, os dados de texto em cada linha são redirecionados >> to $FILE do loop principal depois que o aninhado é executado. Cada caractere / número na cadeia de texto é o resultado do loop aninhado para completar uma vez. Em seguida, o loop for principal envia a saída do loop for aninhado para $FILE .

Então, um exemplo de pseudo-código seria:

for i in $(seq 1 $RANDOM)
do
    for n in {1..10}
    do
        $do_something
    done

$do_something_else
done >> $FILE

head -n 1 $FILE | tail -n 1 | (sed command here)

Como o código acima está estruturado não faz diferença para a necessidade aqui. Eu simplesmente procuro um método leve para a manipulação de texto descrita acima em relação aos espaços. Se isso foi perguntado antes, minhas desculpas. Não consegui encontrá-lo nas minhas perguntas.

    
por Yokai 13.10.2016 / 13:12

3 respostas

6

Isso deve funcionar:

sed 's/ \([^ ]\)//g'

Você também pode substituir toda a última linha do script por:

sed -n '1s/ \([^ ]\)//gp' "$FILE"
    
por 13.10.2016 / 13:58
3

Que tal isso:

$ head -n1 $FILE | tail -n 1 | sed 's,  ,|,g' | sed 's, ,,g' | sed 's,|, ,g'
1234 23 345 456789

Primeiramente, substituímos todas as ocorrências de espaço duplo em branco por | para distingui-las dos espaços em branco únicos, depois removemos todos os espaços em branco únicos e, finalmente, substituímos | por um único espaço em branco.

    
por 13.10.2016 / 13:53
2

Você pode fazer as substituições em um único comando s em sed:

s/ \( \?\)//g

Para sair após a primeira linha, podemos usar q na linha 1. Colocando juntos:

sed -e 's/ \( \?\)//g' -e '1q'
    
por 13.10.2016 / 17:53