web-dev-qa-db-ja.com

区切り文字で長い行を分割する

このような入力を分割するためにどのコマンドを使用できますか?

foo:bar:baz:quux

これに?

foo
bar
baz
quux

cutコマンドを理解しようとしていますが、「最初の1000文字」や「最初の7フィールド」などの固定量の入力でしか機能しないようです。任意の長い入力を処理する必要があります。

21
japreiss

いくつかのオプションがあります:

  • _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
_
35
Chris Down

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
4
Thor
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux
4
glenn jackman

人々が嫌う理由がわからない xargs

$ xargs --version | head -1
xargs (GNU findutils) 4.7.0
...
$ printf "foo:bar:baz:quux" | xargs -d: -n1
foo
bar
baz
quux
0