最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

shell

运维笔记admin56浏览0评论

shell

shell

shell - 用递增值替换字符串(shell - replace string with incrementing value)

我有这个字符串:

"a | a | a | a | a | a | a | a"

我想用像下面这样的递增值替换每个“|”:

"a0a1a2a3a4a5a6a"

我知道我可以使用gsub来替换字符串:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, ++i)}1'a1a1a1a1a1a1a1a

但似乎gsub仅在每个换行符后递增,所以我现在的解决方案是首先在每个“|”后面添加换行符,然后使用gsub并再次删除换行符:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, " | \n")}1' | awk '{gsub(/\ \|\ /, ++i)}1' | tr -d '\n'a1a2a3a4a5a6a7a

老实说这真令人恶心......

有一个更好的方法吗?

I have this String:

"a | a | a | a | a | a | a | a"

and I want to replace every " | " with an incrementing value like so:

"a0a1a2a3a4a5a6a"

I know I can use gsub to replace strings:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, ++i)}1'a1a1a1a1a1a1a1a

But it seems gsub only increments after each newline, so my solution for now would be first putting a newline after each " | ", then using gsub and deleting the newlines again:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, " | \n")}1' | awk '{gsub(/\ \|\ /, ++i)}1' | tr -d '\n'a1a2a3a4a5a6a7a

Which is honestly just disgusting...

Is there a better way to do this?

最满意答案

你可以像这样使用awk :

s="a | a | a | a | a | a | a | a"awk -F ' *\\| *' -v OFS="" '{s=""; for(i=1; i<NF; i++) s = s $i i-1; print s $i}' <<< "$s"a0a1a2a3a4a5a6a -F ' *\\| *' -F ' *\\| *'将设置| 被可选空间包围为输入字段分隔符。 for循环只是遍历每个字段并在每个字段后追加字段递增位置。

You can use awk like this:

s="a | a | a | a | a | a | a | a"awk -F ' *\\| *' -v OFS="" '{s=""; for(i=1; i<NF; i++) s = s $i i-1; print s $i}' <<< "$s"a0a1a2a3a4a5a6a -F ' *\\| *' will sets | surrounded by optional spaces as input field separator. for loop just goes through each field and appends field incrementing position after each field.

发布评论

评论列表(0)

  1. 暂无评论