Unix “回声”;abc 123"sed';s/\([0-9][0-9][0-9]\)/\1/&x27;
我正在unix中学习sed。我需要一些帮助。我正在努力理解为什么Unix “回声”;abc 123"sed';s/\([0-9][0-9][0-9]\)/\1/&x27;,unix,sed,scripting,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是如何工作的,以及我的方法哪里是错误的。您可能想要: echo 123 abc | sed 's/123/12
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是如何工作的,以及我的方法哪里是错误的。您可能想要:
echo 123 abc | sed 's/123/12/'
或者,如果您想使用正则表达式泛化123
:
cho 123 abc | sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/\1\2/g'
在第一个命令中:
([0-9][0-9][0-9])
匹配123
字段,并将其放入组1中,您可以通过\1
引用它
那么为什么您的第一个命令没有给您123
?正则表达式是正确的,这只是因为您将123
(由[0-9][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][0-9]
你认为s/\([0-9][0-9]\)/\1/
的意思是什么?在第一个例子中,你在这行的末尾有一个额外的]
。你想做什么:echo 123 abc | sed's/123/12/”
?你可以使用-r
,这样你就不需要逃避()
:echo 123 abc | sed-r's/([0-9])([0-9])/\1\2/g'
很好!谢谢乔恩!顺便说一句,在我的mac电脑上,-r
无法识别,我不得不使用-E
。