次の形式の文字列があります。
A B C D
1列に同じパターンを持つ方法は何ですか?
答え1
次の文字列で始めてください。
s='A B C D'
列として印刷するには、bashを使用できます。
$ echo "${s// /$'\n'}"
A
B
C
D
または以下を使用してくださいsed
。
$ sed 's/ /\n/g' <<<"$s"
A
B
C
D
または以下を使用してくださいtr
。
$ tr ' ' '\n' <<<"$s"
A
B
C
D
または以下を使用してくださいawk
。
$ awk '$1==$1' RS=' ' ORS='\n' <<<"$s"
A
B
C
D
または以下を使用してくださいgrep
。
$ grep -o '[[:alpha:]]' <<<"$s"
A
B
C
D
答え2
$ printf '%s\n' A B C D
A
B
C
D
このprintf
コマンドはほとんどのシェルに組み込まれたコマンドであり、1つ以上のプレースホルダを含むフォーマットされた文字列を使用します。この%s
文字列は、「string」(シェルで最も一般的な文字列) のプレースホルダです。より多くの引数が指定されると、フォーマット文字printf
列にプレースホルダがあり(この例のように)、引数リストが使い果たされるまで、フォーマット文字列全体が引き続き適用されます。\n
フォーマット文字列の末尾に(改行)があるので、各文字を1行に表示します。
変数に文字列がある場合:
str='A B C D'
printf '%s\n' $str
これにより、上記と同じ結果が表示されます。拡張は$str
引用されません。これは、文字列の内容が空白に分割されることを意味します(変数の文字はIFS
文字列を単語に分割するために使用され、変数にはデフォルトで空白、タブ、および改行文字が含まれます)。文字列にファイル名ワイルドカード文字(たとえば)が含まれている場合、*
これらのパターンに一致するファイル名が出力されます。noglob
シェルオプションを設定すると(set -f
または使用)set -o noglob
これを防ぐことができます。
str='A B C D *'
set -f
printf '%s\n' $str
set +f