概念的には簡単な作業があります。ファイルに[ゆるい]構造化データがあります。
Testing: debug, default CXXFLAGS
<100's of additional output lines>
Testing: release, default CXXFLAGS
<100's of additional output lines>
...
私はそれをログファイルにまとめようとしています:
echo "Configurations tested:" | tee -a "$TEST_RESULTS"
echo $($GREP 'Testing: ' "$TEST_RESULTS" | $SED 's/Testing: / * /g') | tee -a "$TEST_RESULTS"
変える:
Configurations tested:
* debug, default CXXFLAGS
* release, default CXXFLAGS
私は得る:
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 ...
$TEST_RESULTS
私はファイルバッファから読み込んでgrep
使用するので、ファイルバッファに大きなダメージを与えたと思いますtee
。
結果をシェル変数に入れようとすると、行末が失われて$GREP 'Testing: ' "$TEST_RESULTS" | $SED 's/Testing: / * /g'
大きな接続が発生します。
* debug, default CXXFLAGS * release, default CXXFLAGS ... <30 additional configs>
行末を維持しながら同時にファイルを読み込んで追加する方法は?
私は次の部分に進展しました:
ESCAPED=$($GREP 'Testing: ' "$TEST_RESULTS" | $AWK -F ": " '{print " -" $2 "$"}')
echo $ESCAPED | tr $ '\n' | tee -a "$TEST_RESULTS"
しかし、箇条書きでは機能せず、*
先行スペースを削除するようです。
Configurations tested:
-debug, default CXXFLAGS
-release, default CXXFLAGS
sed
新しいラインのクロスプラットフォームに交換することは絶対的な痛みなので、私はそれを使用しません。プラットフォームには、BSD、Cygwin、Linux、OS X、および Solaris が含まれます。
ベストアンサー1
仮定は、$TEST_RESULTS
テスト出力を含むファイルの名前です。私が正しく理解したら、同じファイルにテスト構成リストを追加したいと思います。
したがって、一時ファイルを使用してください。これにより、このファイルが元のファイルに追加されます。
tmpfile="$( mktemp )"
{
echo "Configurations tested:"
sed -ne 's/^Testing: \(.*\)/ * \1/p' -- "$TEST_RESULTS"
} >"$tmpfile"
cat <"$tmpfile" >>"$TEST_RESULTS"
rm -f -- "$tmpfile"
それがなければmktemp
使用できます
tmpfile="$TEST_RESULTS.tmp"
または
tmpfile=~/tmp/"$(basename -- "$TEST_RESULTS").tmp"
またはこれと似ています...ファイルがまだ存在しないとします(この場合、そのファイル(またはシンボリックリンクで指すファイル)は上書きされ、削除されます)。とにかく、固定名で一時ファイルを作成するためにグローバルに書き込み可能なディレクトリを使用しないでください。これはセキュリティの観点から悪い習慣です。
利用可能なシステムsponge
:
{
echo "Configurations tested:"
sed -ne 's/^Testing: \(.*\)/ * \1/p' -- "$TEST_RESULTS"
} | sponge -a -- "$TEST_RESULTS"
ここでは、sponge -a
前の複合コマンド()の出力が{ ...; }
指定された出力ファイルに追加されます。ユーティリティsponge
は出力を一時的な場所に書き込み、指定されたファイルをその場所に置き換えます。このオプションは、-a
出力を上書きせずに元のファイルに追加します。