在循环中以大行替换每第n次出现

时间:2015-05-26 10:01:31

标签: linux awk sed grep

我有这一行例如:

1,2,3,4,5,6,7,8,9,10

我想在第二次出现“,”时插入换行符(\ n)(用换行符替换第二行)。

4 个答案:

答案 0 :(得分:9)

这可能适合你(GNU sed):

sed 's/,/\n/2;P;D' file

答案 1 :(得分:3)

如果我理解你正在尝试做的事情,那么

echo '1,2,3,4,5,6,7,8,9,10' | sed 's/\([^,]*,[^,]*\),/\1\n/g'

似乎是最直接的方式。 \([^,]*,[^,]*\)将捕获1,23,4等,并且通过通常的s///g替换它们之间的逗号。这将打印

1,2
3,4
5,6
7,8
9,10

答案 2 :(得分:2)

无法为冬季回答添加评论,但它不需要第一个,部分,因为它必须让前一个字段以逗号分隔。

sed 's/\(,[^,]*\),/\1\n/g'

将使用相同的

此外,我还会添加另一种选择(尽管更糟糕,并留下一个尾随换行符)

echo "1,2,3,4,5,6,7,8,9,10" | xargs -d"," -n2 | tr ' ' ','

答案 3 :(得分:1)

我会用awk来做这件事:

$ awk -F, '{ for (i=1; i<=NF; ++i) printf "%s%s", $i, (i%2?FS:RS) }' file
1,2
3,4
5,6
7,8
9,10

它遍历每个字段,打印每个字段,然后打印字段分隔符(定义为逗号)或记录分隔符(换行符),具体取决于i%2的值。

它比其他人提供的sed版本略长,虽然它的一个好处是你可以通过将2更改为你喜欢的任何值来轻松改变每行的列数。

要避免在字段数不可分割的情况下在最后一个字段后面跟踪逗号,可以将三元组更改为i<NF&&i%2?FS:RS