Como gato e sed juntos? [duplicado]

5

Eu tenho essa operação cat then sed :

cat ${location_x}/file_1 > ${location_y}/file2
sed -i "s/0/1/g" /${location_y}/file2

Isso pode ser feito em uma única linha?

Eu posso perder uma chance aqui , mas essa explicação me parece lidar com o oposto disso, e eu não consigo unir os cat e sed acima em uma operação sem duplo e comercial ( && ) ou ponto e vírgula ( ; ) e me aproximando assumir que isso não é possível, mas é importante que eu pergunte aqui porque posso estar errado.

Nem todos os leitores que falam inglês estão familiarizados com os termos "e comercial" ou "ponto-e-vírgula", então eu elaborei esses termos.

    
por user9303970 05.02.2018 / 12:17

2 respostas

20

Sim:

sed 's/0/1/g' "$location_x/file_1" >"$location_y/file2"

Seu código primeiro faz uma cópia do primeiro arquivo e, em seguida, altera a cópia usando a edição sequencial com sed -i . O código acima lê o arquivo original, faz as alterações e grava o resultado no novo arquivo. Não há necessidade de cat aqui.

Se você estiver usando o GNU sed e se o $location_x puder conter uma entrelinha - , você precisará garantir que o caminho não seja interpretado como um sinalizador de linha de comando:

sed -e 's/0/1/g' -- "$location_x/file_1" >"$location_y/file2"

O traço duplo marca o final das opções da linha de comando. A alternativa é usar < para redirecionar o conteúdo do arquivo para sed . Outras implementações sed (BSD sed ) param de analisar a linha de comando para opções no primeiro argumento não-opção enquanto o GNU sed (como algum outro software GNU) reorganiza a linha de comando em sua análise dele.

Para esta operação de edição específica (alterando todos os zeros para uns), o seguinte também funcionará:

tr '0' '1' <"$location_x/file_1" >"$location_y/file2"

Observe que tr sempre lê a entrada padrão, portanto, o < para redirecionar a entrada do arquivo original.

Percebo que na linha de comando sed , você tenta acessar /${location_y}/file2 , que é diferente do caminho na linha acima dele (o / no início do caminho). Isso pode ser um erro de digitação.

    
por 05.02.2018 / 12:21
0

Solução alternativa usando tee apenas para uma abordagem diferente:

cat "${location_x}/file1" |\
  tee "${location_y}/file2" |\
  sed -i "s/0/1/g"

Faz o seguinte:

- cat : lê ${location_x}/file1 e canaliza para tee

- tee : Grava entradas de cat para ${location_y}/file2 e envia para sed

- sed : Executa seu sed na entrada de tee

Opcional: se você quiser gravar a saída de sed em um arquivo, basta anexar > /path/to/file para sobrescrever ou >> /path/to/file para anexar.

Espero que isso ajude!

    
por 06.02.2018 / 01:52