我有一个文件 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