每个匹配模式后的sed / AWK搜索/替换字符串

时间:2019-02-22 12:08:30

标签: linux bash awk sed

我在json这样的变量中有数据-

v={k1:v1,k2:v2,k3:v3,k4:v4,k5:v5,k6:v6,k7:v7,k8:v8}; 

其中键和值可以是任何值。 我需要每隔10个字符将其分成多行。.

echo "${v}" | sed -r 's/.{10}/&\n/g'

这将按照sed进行拆分。但是现在我需要确保仅在每10个字符后找到逗号字符之后才进行拆分...,以便输出应该有有意义的行.. 输出应该是..

k1:v1,k2:v2,
.....

整个想法不是在两者之间断线

谢谢

3 个答案:

答案 0 :(得分:5)

您可以使用

sed -r 's/.{10}[^,]*,/&\n/g'

请参见sed demo online

.{10}[^,]*,模式匹配

  • .{10}-任意10个字符
  • [^,]*-除,之外的0个或更多字符
  • ,-逗号。

&\n替换模式将替换为整个匹配项(&),并在其后添加换行符。

答案 1 :(得分:2)

如果实际上您只是想在每个第二个逗号后添加换行符,那么GNU sed和其他一些sed中就是这样:

$ echo "$v" | sed 's/,[^,]*,/&\n/g'
k1:v1,k2:v2,
k3:v3,k4:v4,
k5:v5,k6:v6,
k7:v7,k8:v8

或这样做是为了在所有shell中跨所有sed进行移植:

sed 's/,[^,]*,/&\
/g'

或使用任何awk进行此操作:

awk '{gsub(/,[^,]*,/,"&\n")}1'

答案 2 :(得分:0)

对不起,感谢您的反馈,这是预期的输出-

{k1:v1,k2:v2,
k3:v3,k4:v4,
k5:v5,k6:v6,
k7:v7,k8:v8}

规则应先查找10个字符,然后查找第一个逗号,然后在该模式后添加新行。 Wiktor代码段实际上是这样做的。但是,我很高兴看到以其他方式实现这一目标。谢谢大家。