CSH脚本中sed命令\1反向引用失效问题求助
解决CSH脚本中sed反向引用失效问题
你的问题出在sed的正则模式与捕获组写法不匹配:
- 当使用
-r参数时,sed启用扩展正则表达式(ERE),此时捕获组用()表示,不需要加反斜杠转义;而你脚本里写的\(.*\)在ERE模式下会被当成普通的括号字符,无法被识别为捕获分组,导致\1找不到对应的匹配组,反向引用失效。 - 终端里能正常运行,大概率是你在终端执行时没有加
-r参数(使用基础正则表达式BRE),此时\(.*\)才是正确的捕获组写法。
两种修复方案
方案1:移除-r参数,使用基础正则表达式
保持捕获组的转义写法,去掉-r即可:
set varun=(lat[0]in fooin booin again ertyin) foreach iso (`echo $varun:q`) set a=`echo "$iso" | sed 's/\(.*\)in/\1/g'` echo $a end
方案2:保留-r参数,使用扩展正则的捕获组写法
把转义的\(.*\)改成无转义的():
set varun=(lat[0]in fooin booin again ertyin) foreach iso (`echo $varun:q`) set a=`echo "$iso" | sed -r 's/(.*)in/\1/g'` echo $a end
两种方案都能正确提取每个字符串中in之前的部分,比如处理lat[0]in会输出lat[0],fooin输出foo等。
内容的提问来源于stack exchange,提问作者Itsme
相关产品推荐
相关产品推荐

