行末を維持しながらファイルを同時に読み込み、追加します。

行末を維持しながらファイルを同時に読み込み、追加します。

概念的には簡単な作業があります。ファイルに[ゆるい]構造化データがあります。

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出力を上書きせずに元のファイルに追加します。

おすすめ記事