使用sed提取字符串中tXX_noTap_/tXXX_noTap_后的内容失败求助
问题分析与修复方案
核心问题1:csh变量赋值语法错误
csh/tcsh中变量赋值时等号两边不能有空格,原代码里set MARKER_LIST = "..."的写法会导致变量未正确赋值,后续foreach循环无法遍历预期的标记列表。
核心问题2:sed正则匹配可优化
原sed命令的^.*t[0-9]*_noTap_使用了贪婪匹配的.*,虽然单个标记字符串中仅存在一个目标前缀,但可以通过更精准的正则匹配避免潜在的意外问题。
修复后的完整代码
set MARKER_LIST="t14_noTap_leftSlow t24_noTap_leftMedium t34_noTap_leftFast \ t44_noTap_rightSlow t54_noTap_rightMedium t64_noTap_rightFast \ t74_noTap_inphaseSlow t84_noTap_inphaseMedium t94_noTap_inphaseFast \ t104_noTap_antiphaseSlow t114_noTap_antiphaseMedium t124_noTap_antiphaseFast" foreach code (${MARKER_LIST}) # 精准匹配前缀并移除,保留后续内容 set evt_code = `echo ${code} | sed 's/^t[0-9]*_noTap_//'` echo "Extracted value: $evt_code" end
额外优化方案(无需外部命令,用csh内置功能)
如果不想调用sed,可以直接使用csh的内置字符串替换,效率更高:
set MARKER_LIST="t14_noTap_leftSlow t24_noTap_leftMedium t34_noTap_leftFast \ t44_noTap_rightSlow t54_noTap_rightMedium t64_noTap_rightFast \ t74_noTap_inphaseSlow t84_noTap_inphaseMedium t94_noTap_inphaseFast \ t104_noTap_antiphaseSlow t114_noTap_antiphaseMedium t124_noTap_antiphaseFast" foreach code (${MARKER_LIST}) # 内置替换语法移除前缀 set evt_code = ${code:s/^t[0-9]*_noTap_//} echo "Extracted value: $evt_code" end
预期输出
修复后运行代码会得到如下结果:
Extracted value: leftSlow Extracted value: leftMedium Extracted value: leftFast Extracted value: rightSlow Extracted value: rightMedium Extracted value: rightFast Extracted value: inphaseSlow Extracted value: inphaseMedium Extracted value: inphaseFast Extracted value: antiphaseSlow Extracted value: antiphaseMedium Extracted value: antiphaseFast
内容的提问来源于stack exchange,提问作者A.R.
相关产品推荐
相关产品推荐

