変数に格納されている行の先頭にタブ文字を追加する

変数に格納されている行の先頭にタブ文字を追加する

クライアントから受け取った.zipファイルを処理するスクリプトを作成しています。作業をしてみると、受信した.zipファイルの内容を確認手段としてログファイルにリストしたい場合が多いです。テストファイルからファイルリストを抽出して、ログファイルにファイルリストを挿入できました。

これで、ログファイルから抽出されたファイル名の前に改行とタブを追加してログファイルをクリーンアップしようとしています。一番近くにいたコメントしました。次の例では、1行の出力にのみタブを追加します。次にSEDの使用を検討しましたが、SEDに関する知識が不足しており、ログファイルに空白行のみが表示されました。

    log_message "-------- Extracting files"
    zipflist="`unzip -Z1 $file`"
    log_message "Files found in received zip file..."
#    log_message $'\n\t\t\t'"$zipflist"
    log_message `sed '1 s/^/$'\t'"$zipflist"/' `

"log_message"関数は、日付/時刻の前に付けられた文字列をファイルに渡します。

これは私が今まで得た最高の結果です。

2023-12-29 09:31:44: Files found in received zip file...
2023-12-29 09:31:44:
                        loremipsum.pdf
loremipsum.txt
dummy_report.xml

出力が次のようになります。

2023-12-29 09:31:44: Files found in received zip file...
2023-12-29 09:31:44:
                        loremipsum.pdf
                        loremipsum.txt
                        dummy_report.xml

RHELのSED、tr、またはその他の基本ユーティリティを使用してこれを行う方法はありますか?会社が承認していないものはインストールできないため、持っているものを使用することをお勧めします。 (承認の手間を軽減します)

答え1

% str=$'foo\nbar\ndoo\n'
% printf "%s" "$str" |sed -e $'s/^/\t/'
    foo
    bar
    doo

(リストで他のタスクを実行する予定がない場合は、unzip | sedvarを使用せずに直接実行できます。)

答え2

Bashシェルでは、要素として格納されている行を使用してこれを実行できます。大量に変数は次のとおりです。まずzipinfo、出力を文字列スカラー変数の代わりにシェル配列に読み込み、次にパラメータ${parameter/pattern/string}拡張配列型を使用して各要素の接頭辞を付けます。

たとえば、単純なログ関数が与えられた場合

log_message() { printf '%s\n' "$@"; }

それから

readarray -t zipflist < <(unzip -Z1 "$file")
log_message "${zipflist[@]/#/$'\t'}"

答え3

「ここで文字列」を使用できます。

sed -e $'s/^/\t\t\t/' <<< "$zipflist"

これは、ファイルのリスト(改行文字で区切られた)がすでにシェル変数にある場合に適しています。

ただし、これをコマンドからシェル変数に入れるので、元のコマンドから直接書式設定することをお勧めします。

zipflist="$(unzip -Z1 "$file" | sed $'s/^/\t\t\t/')"

それで直面する問題は、最初の行がソートされないことです。次のように、前に改行文字を追加することでこれを処理できます。

log_message "-------- Extracting files"
zipflist="$(unzip -Z1 "$file" | sed -e $'1i\\\n' -e $'s/^/\t\t\t/g')"
log_message "$zipflist"

これにより、質問に表示したい結果が正確に生成されます。


log_message追加の説明:このコマンドが何であるか疑問に思います。一般に、ログヘルパー関数のロジックをクリーンアップしてコンテンツを直接渡すことができ、適切に処理するようにし、ログが一般的に行うように、各入力行の前にタイムスタンプを追加する方が良いかもしれません。 Linuxシステムの場合は、loggerこのようなスペースを操作することなくこのコマンドを使用できます。 loggerデフォルトではシステムログが記録されますが、そのセクションをオフにして標準エラーを使用することもできます。

良いフォローアップの質問は次のとおりです。 「現在のタイムスタンプをスクリプト出力の各行の前に追加するためのきれいで迅速な方法はありますか?」まっすぐ.)

関連情報