如何使用 sed 将数字替换为括号?

如何使用 sed 将数字替换为括号?

我有一个文件 test.txt 包含许多行,如下所示:

hello:123: world
hello:783: world
hello:479: world
......

如何使用sed命令替换如下行?

hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world
......

提前致谢!

答案1

你觉得这个怎么样?我希望这是你所需要的。

sed -e 's/\([0-9]\+\)/(\1, 0)/g'

测试

echo "hello:123: world
hello:783: world
hello:479: world" | sed -e 's/\([0-9]\+\)/(\1, 0)/g'

结果

你好:(123, 0): 世界

你好:(783, 0): 世界

你好:(479, 0): 世界

答案2

POSIXly:

sed 's/[0-9]\{1,\}/(&, 0)/' < file

将每行上第一次出现的一系列一个或多个 ( \{1,\}) 十进制数字替换为(&, 0)&要替换的文本的位置)。

当您可以使用代替 时,某些sed实现可以-E选择使用扩展正则表达式 (ERE) 而不是基本正则表达式 (BRE) 。可能会进入 POSIX 规范的下一版本:+\{1,\}-E

sed -E 's/[0-9]+/(&, 0)/' < file

一些sed实现(例如 GNU)sed支持\+作为 BRE 别名,尽管\{1,\}这不是可移植/标准的。

要使用正在成为正则表达式的新事实标准的 perl 正则表达式,您可以使用... perl

perl -pe 's/\d+/($&, 0)/' < file

答案3

假设输入有:分隔文本并且第二列需要更改:

$ awk 'BEGIN{ FS=OFS=":" } {$2 = "("$2", 0)"} 1' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world

或者,与perl

$ perl -F: -lane '$F[1] = "($F[1], 0)"; print join ":",@F' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world

相关内容