
如何将数字从字符串的一端复制到字符串的另一端?所以举个例子,
输入 -
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 j
j
:最后打印带有我们号码的原始字符串
答案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 之前的回答的帮助下。)