在定界符上分割长行


21

我可以使用以下命令来拆分输入:

foo:bar:baz:quux

入这个?

foo
bar
baz
quux

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


5
你是说喜欢tr : '\n' < input吗?
2012年

您正在使用什么外壳?ash?
glenn jackman 2012年

Answers:


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是否有办法使前两个在AIX中工作?
cokedude

4
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.