echo { sl { abc }} | sed 's/ \([{}]\) /\1/g'中用的?为什么可删除{和}前后的所有空格而不是单个

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/08 13:16:41
echo { sl { abc }} | sed 's/ \([{}]\) /\1/g'中用的?为什么可删除{和}前后的所有空格而不是单个

echo { sl { abc }} | sed 's/ \([{}]\) /\1/g'中用的?为什么可删除{和}前后的所有空格而不是单个
echo { sl { abc }} | sed 's/ \([{}]\) /\1/g'中用的?为什么可删除{和}前后的所有空格而不是单个

echo { sl { abc }} | sed 's/ \([{}]\) /\1/g'中用的?为什么可删除{和}前后的所有空格而不是单个

一般来说 /g 参数的意思是在一行匹配多次,直到匹配失败再执行下一条命令.


另外还有一点就是,其实 echo 遇到多个空格其实也就输出一个,除非你用引号之类的把要输出的东西括起来.你可以自己试试.


这个命令整体来讲还是挺奇怪的,不太容易看明白.其实它的意思是保留 { 或者 },但是要把它前后的空格删去.


用空格不太容易看清楚,我换成点可能更容易解释:

$ echo "..{.si...{...abc..}...}.." | sed -e 's/\.\?\([{}]\)\.\?/\1/g'
.{...si..{..abc.}.}.

/\.\?\([{}]\)\.\?/ 的主体是 \([{}]\) 它的意思是匹配 { 或者 }.并把这个结果记住以备在替换时使用.\.\? 的意思是最多匹配一个点,可有可无.然后整个替换成 \1 也就是之前记住的部分.所以这个命令的实际意思是找到 { 或者 } 然后就把它之前 和/或 之后的空格替换掉.


通过数 . 可以发现其实 sed 只对每个 { 或者 } 执行了一次替换(虽然这一行上的每一个 { 和 } 都执行了一次,这是 /g 的作用).这是合理的,因为某一个 { 执行替换之后,sed 记住了本次匹配点的位置,再匹配时是从该点的下一个位置开始寻找的.这是正则表达式的一种标准实现方式.