このような入力を分割するためにどのコマンドを使用できますか?
foo:bar:baz:quux
これに?
foo
bar
baz
quux
cut
コマンドを理解しようとしていますが、「最初の1000文字」や「最初の7フィールド」などの固定量の入力でしか機能しないようです。任意の長い入力を処理する必要があります。
いくつかのオプションがあります:
tr : \\n
_sed 's/:/\n/g'
_(with GNU sed)awk '{ gsub(":", "\n") } 1'
これは純粋なbash
でも実行できます。
_while IFS=: read -ra line; do
printf '%s\n' "${line[@]}"
done
_
Grepが-o
をサポートしている場合は、次のように実行できます。
grep -o '[^:]\+'
または、awkを使用して、レコード区切り文字を:
に設定します。
awk -v RS=: 1
またはGNU cut:
cut -d: --output-delimiter=$'\n' -f1-
以下のクリスによって指摘されているように、これは末尾の改行を残します。これは、awkがRS
を正規表現として指定できる場合に回避できます(GNU awkでテスト):
awk -v RS='[:\n]' 1
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux
人々が嫌う理由がわからない xargs
$ xargs --version | head -1
xargs (GNU findutils) 4.7.0
...
$ printf "foo:bar:baz:quux" | xargs -d: -n1
foo
bar
baz
quux