Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix “回声”;abc 123"sed';s/\([0-9][0-9][0-9]\)/\1/&x27;_Unix_Sed_Scripting - Fatal编程技术网

Unix “回声”;abc 123"sed';s/\([0-9][0-9][0-9]\)/\1/&x27;

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

我正在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/'
或者,如果您想使用正则表达式泛化
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