Bash: reescrevendo um arquivo que é lido na mesma linha

0

Estou trabalhando em um script bash para automatizar parcialmente a conexão do roteador na linha de comando. Esta é uma parte em que tenho um problema:

#!/bin/bash
STRING2="ESSID"
MYPWD=$(pwd)
sudo iwlist wlan1 scan | grep $STRING2 | grep -n $STRING2 > $STRING2.txt
sed -r -e 's/\s+//g' -e 's/:ESSID//' $MYPWD"/"$STRING2".txt

A última linha abre um arquivo de texto e, em seguida, exclui espaços em branco e também: ESSID's do arquivo de texto que é $MYPWD/$STRING2.txt . O que eu quero fazer é também escrever a saída de sed para esse arquivo por meio de tubulação. Uma abordagem anterior estava canalizando grep : > $MYPWD"/"$STRING2".txt" no final, como:

sed -r -e 's/\s+//g' -e 's/:ESSID//' $MYPWD"/"$STRING2".txt | grep : > $MYPWD"/"$STRING2".txt"

Mas acabou com um $MYPWD/$STRING2.txt vazio. Não sei por que isso está acontecendo. Alguma idéia?

Editar

Sem o último grep canalizado, o arquivo de texto contém algum texto assim após a execução:

1:

por Tolga Varol 28.07.2015 / 18:11

1 resposta

3

Quando você tem um comando como este

sed -e ... "datafile" >"datafile"

Você terminará com um resultado de comprimento zero. A razão é que o shell configura stdin e stdout antes de executar o comando. Então, o stdout é enviado para o arquivo datafile , criando ou truncando-o no processo, e só então a sed -e ... "datafile" é executada.

Uma solução comum é algo assim

sed -e ... "datafile" >"datafile.tmp" && mv -f "datafile.tmp" "datafile"

Alguns comandos (incluindo versões de sed ) têm a opção editar no lugar :

sed -i.bak -e ... "datafile"
sed --in-place=.bak -e ... "datafile"
    
por 28.07.2015 / 18:36

Tags