在分隔符上拆分长行

jap*_*iss 29 shell text-processing

我可以使用什么命令来拆分这样的输入:

foo:bar:baz:quux
Run Code Online (Sandbox Code Playgroud)

成这个?

foo
bar
baz
quux
Run Code Online (Sandbox Code Playgroud)

我试图找出cut命令,但它似乎只适用于固定数量的输入,例如“前 1000 个字符”或“前 7 个字段”。我需要处理任意长的输入。

Chr*_*own 43

有几个选项:

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

您也可以在 pure 中执行此操作bash

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done
Run Code Online (Sandbox Code Playgroud)

  • 请注意,像这样在替换字符串中使用 `\n` 将在 GNU sed 中工作,但在大多数其他 sed 实现中将失败。 (3认同)

Tho*_*hor 5

如果你的 grep 支持,-o你可以这样做:

grep -o '[^:]\+'
Run Code Online (Sandbox Code Playgroud)

或者使用 awk,将记录分隔符设置为:

awk -v RS=: 1
Run Code Online (Sandbox Code Playgroud)

或者使用 GNU 剪切:

cut -d: --output-delimiter=$'\n' -f1-
Run Code Online (Sandbox Code Playgroud)

编辑

RS正如下面 Chris 所指出的,这将留下尾随换行符,如果您的 awk 支持指定为正则表达式(使用 GNU awk 测试),则可以避免这种情况:

awk -v RS='[:\n]' 1
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux
Run Code Online (Sandbox Code Playgroud)