2014-06-15 84 views
-1

我在学习unix中的sed。我需要一些帮助。我试图理解为什么echo“abc 123”| sed's/([0-9] [0-9] [0-9] )/ 1 /'

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

你觉得's/\([0-9] [0-9] [0-9] \)/ \ 1 /'是什么意思? – ruakh

+0

在第一个例子中,你在行尾有一个额外的']。你想要做什么:'echo 123 abc | sed's/123/12 /''? – alfasin

回答

0

你可能要么需要这样的:

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

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

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

您可以使用'-r',因此您不需要转义'()':'echo 123 abc | sed -r's /([0-9])([0-9])([0-9])/ \ 1 \ 2/g'' – Jotne

+0

不错!谢谢Jotne!顺便说一句,在我的Mac上'-r'无法识别,我不得不使用'-E'。 – alfasin

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

所以要更换整个字符串123sed打印出模式空间中的内容默认情况下。

如果您只想打印12,只需将([0-9][0-9][0-9])更改为([0-9][0-9])即可。您可以使用[0-9]{3}而不是[0-9][0-9][0-9]

相关问题