Shell 如何理解MAC OS上Sed的输出?

Shell 如何理解MAC OS上Sed的输出?,shell,sed,Shell,Sed,命令: 回音aabb | sed-n-es/[a-z]/\1/p 产出: aabb 命令: 回音aabb | sed-n-es/[a-z][a-z]/\1/p 产出: 神甫 命令: 回音aabb | sed-n-es/[a-z][a-z]/\1\2/p 产出: 神甫 以上3个输出让我困惑 据我了解: 第一个应该是a; 第二个应该是a; 第三个应该是a。 但实际结果出乎意料。为什么?我想这是因为你的正则表达式不完整,你需要给出。*在你的正则表达式中,比如: echo "aabb" |sed -n

命令:

回音aabb | sed-n-es/[a-z]/\1/p 产出:

aabb 命令:

回音aabb | sed-n-es/[a-z][a-z]/\1/p 产出:

神甫 命令:

回音aabb | sed-n-es/[a-z][a-z]/\1\2/p 产出:

神甫 以上3个输出让我困惑

据我了解:

第一个应该是a; 第二个应该是a; 第三个应该是a。
但实际结果出乎意料。为什么?

我想这是因为你的正则表达式不完整,你需要给出。*在你的正则表达式中,比如:

echo "aabb" |sed -n -E "s/([a-z]).*/\1/p"
通过这样做,我们准确地捕捉到一个字符,然后匹配行的其余部分,因此它可以很好地打印出来

为什么single[a-z]不起作用:因为它只在行中查找单个字符,并且当正则表达式不匹配任何内容时,整行进入\1临时缓冲区,因此它将打印整行

让我们举一个例子,行只有一个字符,那么OP的正则表达式将工作eg->

echo "a" |sed -n -E "s/([a-z])/\1/p"
注意:您也可以在命令中删除-n和/p部分,并可以使用以下命令:

echo "aabb" |sed -E "s/([a-z]).*/\1/"

这是因为你的正则表达式不完整,你需要给出。*在你的正则表达式中,比如:

echo "aabb" |sed -n -E "s/([a-z]).*/\1/p"
通过这样做,我们准确地捕捉到一个字符,然后匹配行的其余部分,因此它可以很好地打印出来

为什么single[a-z]不起作用:因为它只在行中查找单个字符,并且当正则表达式不匹配任何内容时,整行进入\1临时缓冲区,因此它将打印整行

让我们举一个例子,行只有一个字符,那么OP的正则表达式将工作eg->

echo "a" |sed -n -E "s/([a-z])/\1/p"
注意:您也可以在命令中删除-n和/p部分,并可以使用以下命令:

echo "aabb" |sed -E "s/([a-z]).*/\1/"
但实际结果出乎意料。为什么?

在我看来,你似乎期望正则表达式将取代整个行。没有。它只替换匹配的部分,即与正则表达式匹配的输入部分。只有这一部分被替换

例如:

echo "aabb" |sed -n -E "s/([a-z])([a-z])/\1 \2/p"
正则表达式匹配:

aabb
^^       - those two characters are the _first_ match against ([a-z])([a-z])
^        - saved in \1
 ^       - saved in \2
^^ only this part is replaced by `\1 \2` which results in:
a abb
^^^   the replacement `\1 \2`
   ^^ the rest of the input is left untouched
然后,只有输入的匹配部分被替换字符串替换。因此,aa部分替换为\1\2。正则表达式之前或之后的行部分保持不变

但实际结果出乎意料。为什么?

在我看来,你似乎期望正则表达式将取代整个行。没有。它只替换匹配的部分,即与正则表达式匹配的输入部分。只有这一部分被替换

例如:

echo "aabb" |sed -n -E "s/([a-z])([a-z])/\1 \2/p"
正则表达式匹配:

aabb
^^       - those two characters are the _first_ match against ([a-z])([a-z])
^        - saved in \1
 ^       - saved in \2
^^ only this part is replaced by `\1 \2` which results in:
a abb
^^^   the replacement `\1 \2`
   ^^ the rest of the input is left untouched
然后,只有输入的匹配部分被替换字符串替换。因此,aa部分替换为\1\2。正则表达式之前或之后的行部分保持不变