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


21

このような入力を分割するために使用できるコマンドは次のとおりです。

foo:bar:baz:quux

これに?

foo
bar
baz
quux

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


5
どういう意味tr : '\n' < input
jw013

どのシェルを使用していますか?バッシュ?
グレンジャックマン

回答:


34

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

  • tr : \\n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

純粋にこれを行うこともできますbash

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done

3
その\nような置換文字列で使用すると、GNU sedで機能しますが、他のほとんどのsed実装では失敗します。
-wjv

@chrisdown最初の2つをAIXで動作させる方法はありますか?
cokedude


4

grepがサポートしている場合、次の-oようにできます。

grep -o '[^:]\+'

または、awkを使用して、レコード区切り文字を:次のように設定します。

awk -v RS=: 1

またはGNUカットを使用:

cut -d: --output-delimiter=$'\n' -f1-

編集

以下のChrisが述べたように、これは末尾の改行を残します。awk RSが正規表現(GNU awkでテスト済み)として指定することをサポートしている場合、これは回避できます。

awk -v RS='[:\n]' 1

あなたのawk例は、(おそらく望ましくない)末尾の改行を残します。
クリスダウン

@ChrisDown:そのとおりです。RSを正規表現にできる場合、これは回避できます。
トール

-1

一部の文字列では、上記のソリューションに問題がありました。しかし、これは私のために働いた:

echo $string | sed 's/\\n/ /g' | tr " " \\n

書かれているように、これはOPのサンプル入力を変換しません。
kbulgrien
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.