👏

【Shell】文字列分解の様々なパターン

2021/01/12に公開

はじめに

  • 用途は少ないが、文字列を1文字ずつ分解して処理する場合がある。
  • その際に、各環境で利用できるオプションや日本語問題に対応する必要がある。
  • 今回は、文字列分解コマンドの複数パターン紹介と無難パターンを記録する。

環境

  • Mac OS X 10.15.6
  • ZSH 5.7.1

結果

  • 以下、結果の内容。
# パターン1 : foldとgrep(v)の利用
# ※全角の場合は、空行が入るためgrepで削除。
echo "Good" | fold -1 | grep -v '^$'

# パターン2 : sedとtrの利用
# ※最終行が追加されるので、最後のsedで削除
echo "Good" | sed 's!.!& !g' | tr ' ' '\n' | sed '$d'

# パターン3 : sedとxargsの利用(無難)
echo "Good" | sed 's/./& /g' | xargs -n1

# パターン4 : grep(o)の利用
# ※grepのoオプションは、環境によって利用できない。(POSIX未対応のため)
echo "Good" | grep -o .
# 各パターンの出力結果
G
o
o
d

内容

パターン1

  • 主に以下のような処理。
    • foldを利用して、出力幅を1文字に限定。
    • grepのvオプションを利用して、不要な空行を削除。
      • ※半角のみであれば、foldのみで問題ない。

パターン2

  • 主に以下のような処理。
    • sedで一文字ずつ後ろにスペースを追加。
    • trで追加された改行へ置換。
    • sedで最後に追加された不要な改行を削除

パターン3

  • 主に以下のような処理。
    • sedで一文字ずつ後ろにスペースを追加。
    • xargsのnオプションを利用して、入力引数の最大値指定。

パターン4

  • 主に以下のような処理。
    • grepのoオプションを利用して、1文字ずつマッチする毎に出力。
    • ※oオプションは、環境によって利用できない場合がある。自身の環境は可能。

まとめ

  • 上記のことから、環境および全角対応等の点からパターン3のsedとxargsの利用を無難とする。
  • ただ、短述的で不要処理の無さという点から、パターン4の利用も検討する。

参考

Discussion