echo“abc 123”| sed's / \([0-9] [0-9] [0-9] \)/ \ 1 /'

时间:2014-06-15 05:05:44

标签: unix sed scripting

我正在学习unix中的sed。我需要一些帮助。我想了解原因

echo 123 abc | sed  's/\([0-9][0-9][0-9]\)/\1/' ]
当我尝试打印三个数字字母" 123"时,

不起作用, 但是当我使用

时它会起作用
echo 123 abc | sed  's/.* \([0-9][0-9][0-9]\).*/\1/'

如何打印" 12"而不是" 123"?

请让我知道sed是如何工作的以及我的方法是错误的。

2 个答案:

答案 0 :(得分:0)

你可能要么想要这个:

echo 123 abc | sed  's/123/12/'

或者如果您想使用正则表达式来概括123

cho 123 abc | sed  's/\([0-9]\)\([0-9]\)\([0-9]\)/\1\2/g'

答案 1 :(得分:0)

在您的第一个命令中:([0-9][0-9][0-9])123字段匹配,并将其放在第1组中,您可以通过\1引用它。

那么为什么你的第一个命令没有给你123?正则表达式是正确的,这只是因为您将123(与[0-9][0-9][0-9]匹配)替换为123(由\1引用)并且似乎发生了一些事情。

现在,您可能会理解为什么第二个命令有效。由于.匹配任何字符,*表示重复零次或多次,所以 ([0-9][0-9][0-9]).*匹配整个字符串,并将123放入第1组。

所以你在第二个命令中用123替换整个字符串,sed默认在PatternSpace中打印内容。

如果您只想打印12,只需将([0-9][0-9][0-9])更改为([0-9][0-9])

顺便说一句,您可以使用[0-9]{3}代替[0-9][0-9][0-9]