我有一个字符串,我需要#
在开头添加 , 即转换[ -n "$ID" -a "$ID" -le 200 ] && return
为#[ -n "$ID" -a "$ID" -le 200 ] && return
. 我可以使用以下命令:
echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -e 's/\[ -n "$ID" -a "$ID" -le 200 \] && return/#&/p'
有用。现在我有两个问题,关于E
, flag。
对于 string
[ -n "$ID" -a "$ID" -le 200 ]
,如果我转义括号,它就不起作用;但是,当我不逃避它们时它会起作用,即sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
工作时
sed -n -E 's/\[ -n "$ID" -a "$ID" -le 200 \]/#&/p'
不起作用。
因为,完整的字符串
[ -n "$ID" -a "$ID" -le 200 ] && return
,当我不逃避它们时,它给了我错误的答案:echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ] && return/#&/p'
它给了我输出:
[ -n "$ID" -a "$ID" -le 200 #] && return
我想知道它是如何工作的。
不按您期望的方式工作,更多的是巧合:
[...]
是匹配的字符的集合。在该集合中,您有一个-n
从空格 (0x20) 到n
(0x6E) 的范围,其中可以包括[
(0x5B),具体取决于您的语言环境设置。所以集合匹配第一个字符。看看当你#&___
作为替代品时会发生什么......我猜不是你的意图?这就是你的完整案例失败的原因:集合的匹配字符是,
]
因为它后面是模式的其余部分,这#
就是插入那里的原因。扩展正则表达式的问题就像@steeldriver 假设的那样:
$
锚定模式:因此,在 ERE 中,
$
需要对文字进行转义,而在 BRE 中,仅在作为模式的最后一个字符时才需要对其进行转义。另请注意,
-e
将下一个参数标记为脚本,如果只有一个脚本,则它是可选的,而 while-E
是一个开关。删除-e
“-E”仅在只有一个脚本时才有效,因为无论如何它都是多余的。