POSIXの方法で文字列変数の行数を計算する方法は?

POSIXの方法で文字列変数の行数を計算する方法は?

Bashでこれを行うことができることを知っています。

wc -l <<< "${string_variable}"

基本的に私が見つけたものはすべて<<<Bash演算子に関連しています。

しかし、POSIXシェルでは<<<定義されておらず、何時間も解決策が見つかりませんでした。私は簡単な解決策があると確信していますが、残念ながらこれまで解決策が見つかりませんでした。

ベストアンサー1

簡単な答えはwc -l <<< "${string_variable}"ですprintf "%s\n" "${string_variable}" | wc -l

<<<実際、パイプは異なる動作をします。<<<コマンドへの入力として渡すために一時ファイルが生成され、|パイプは生成されます。 bashとpdksh / mksh(ksh93またはzshを除く)では、パイプの右側のコマンドはサブシェルで実行されます。しかし、この特別なケースでは、これらの違いは重要ではありません。

行数に関しては、これは変数が空ではなく改行文字で終わらないと仮定します。変数がコマンド置換の結果である場合は改行で終わらないため、ほとんどの場合は正しい結果が得られますが、空の文字列の場合は1が得られます。

var=$(somecommand); wc -l <<<"$var"との間には2つの違いがありますsomecommand | wc -l。コマンド置換と一時変数を使用すると、出力の最後の行が改行で終わるかどうかを忘れ、末尾の空白行が削除されます(コマンドが空でない有効なテキストファイルを出力する場合は常にそうです)。出力が空の場合は、1 つを追加します。結果行と数行の両方を保持するには、既知のテキストを追加して末尾から削除します。

output=$(somecommand; echo .)
line_count=$(($(printf "%s\n" "$output" | wc -l) - 1))
printf "The exact output is:\n%s" "${output%.}"

おすすめ記事