将数字从字符串末尾复制到另一个

将数字从字符串末尾复制到另一个

如何将数字从字符串的一端复制到字符串的另一端?所以举个例子,

输入 -

Example123:Hello
Exp12:Hey1
Exp:heylo

预期产出 -

Example123:Hello123
Exp12:Hey112
Exp:heylo

我愿意使用 sed 或 awk,必须考虑分隔符,因此 row1 是从中提取数字的行,第 2 行是放置数字的行

答案1

:假设输入的每一行中只出现一次,您可以执行以下操作:

sed 's/\([[:digit:]]*\):.*/&\1/' < input

如果可以有多个:(并且您想将数字附加到行尾,而不是第二个字段),那就会变得更加复杂,例如:

sed 's/^\([^:]*[^:[:digit:]]\)\{0,1\}\([[:digit:]]*\):.*/&\2/' < input

答案2

你可以在这里使用 awk

awk -F':' '{ j=$1; gsub(/[^0-9]+/,"",j); print $0 j }' 

解释

-F':': 告诉 awk 使用冒号作为字段分隔符

j=$1; gsub(/[^0-9]+/,"",j):将第一列分配给临时变量j,然后从其中删除所有非数字的内容j

print $0 jj:最后打印带有我们号码的原始字符串

答案3

使用match()GNU awk 将匹配组存储在数组中的功能,您可以这样做

awk -F: -v OFS=: 'match($1, /([0-9]+)$/ , arr) { $2 = $2 arr[1] } 1' file

在任何 POSIX 兼容上awk你可以做

awk -F: -v OFS=: 'match($1, /[[:digit:]]+$/) { $2 = $2 substr($0, RSTART, RLENGTH) }; 1' file

如何使用 awk 永久更改文件? (“就地”编辑,与“sed -i”一样)使文件更改持久化。

答案4

bash 中尽可能短...我认为...

sed 's/\([0-9]\+:\).*/&\1/' < input

(在 @Stèphane 之前的回答的帮助下。)

相关内容