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'a1a1a1a1a1a1a1aBut 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'a1a2a3a4a5a6a7aWhich 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.