Lê e anexa ao arquivo ao mesmo tempo enquanto preserva o fim da linha

2

Conceitualmente, tenho uma tarefa fácil ... Eu tenho [vagamente] dados estruturados em um arquivo:

Testing: debug, default CXXFLAGS
<100's of additional output lines>
Testing: release, default CXXFLAGS
<100's of additional output lines>
...

Eu tento resumi-lo em um arquivo de log:

echo "Configurations tested:" | tee -a "$TEST_RESULTS"
echo $($GREP 'Testing: ' "$TEST_RESULTS" | $SED 's/Testing: /    * /g') | tee -a "$TEST_RESULTS"

Em vez de:

Configurations tested:
    * debug, default CXXFLAGS
    * release, default CXXFLAGS

Eu recebo:

Configurations tested:
1 3way.cpp 3way.h CMakeLists.txt CMakeLists.txt.diff Doxyfile Filelist.txt GNUmakefile
GNUmakefile-cross Install.txt License.txt Readme.txt TestData TestVectors adhoc.cpp.proto
adler32.cpp adler32.h aes.h algebra.cpp algebra.h ...

Eu acho que estou causando estragos no buffer de arquivo $TEST_RESULTS porque está sendo lido no grep e escrito com tee .

Quando tento colocar o resultado de $GREP 'Testing: ' "$TEST_RESULTS" | $SED 's/Testing: / * /g' em uma variável de shell, perco as terminações de linha que resultam em uma grande concatenação:

* debug, default CXXFLAGS    * release, default CXXFLAGS ... <30 additional configs>

Como faço para ler e acrescentar um arquivo ao mesmo tempo, preservando o fim das linhas?

Eu fiz alguns progressos com:

ESCAPED=$($GREP 'Testing: ' "$TEST_RESULTS" | $AWK -F ": " '{print "  -" $2 "$"}')
echo $ESCAPED | tr $ '\n' | tee -a "$TEST_RESULTS"

No entanto, não é possível usar * como ponto de destaque e parece perder espaço inicial:

Configurations tested:
-debug, default CXXFLAGS
 -release, default CXXFLAGS

Eu não estou usando sed porque a troca de uma nova linha é um problema absoluto entre as plataformas. As plataformas incluem BSD, Cygwin, Linux, OS X e Solaris.

    
por jww 18.06.2016 / 14:20

2 respostas

0

Eu tentaria algo como:

awk -v pattern="Testing:" '$0 ~ pattern { sub(pattern, "  *"); print }' 

Isso deve funcionar com qualquer versão de sed , pois não contém extensões óbvias. Não é necessário manipular as novas linhas explicitamente desde que você cuide para citar suas variáveis adequadamente, a fim de evitar a divisão de palavras.

    
por 20.06.2016 / 10:46
0

Assumindo $TEST_RESULTS é o nome de um arquivo que contém a saída de teste. Se bem entendi, você deseja anexar a lista de configurações testadas ao mesmo arquivo.

Então, use um arquivo temporário. Em seguida, anexe esse arquivo ao original.

tmpfile="$( mktemp )"
echo "Configurations tested:" >"$tmpfile"
sed -n 's/^Testing: \(.*\)/  * /p' "$TEST_RESULTS" >>"$tmpfile"

cat "$tmpfile" >>"$TEST_RESULTS"
rm -f "$tmpfile"

Se você não tiver mktemp , poderá usar

tmpfile="$TEST_RESULTS.tmp"

ou

tmpfile="/tmp/$( basename "$TEST_RESULTS" ).tmp"

ou algo similar ... assumindo que o arquivo ainda não existe (caso em que ele será sobrescrito e removido).

    
por 05.01.2017 / 12:40