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.