CSH脚本中用awk处理含特殊字符文件并生成数组的问题
在CSH脚本中提取含特殊字符行的解决方案
问题根源
CSH会把命令中的[]当作通配符解析,导致传给awk的正则表达式被篡改,而Bash默认不会做这种解析,所以相同逻辑在Bash中能正常运行。
解决方法
核心是让CSH不解析awk脚本里的特殊字符,同时正确处理正则中的特殊符号:
- 用单引号包裹整个awk脚本:这样CSH会原封不动把脚本传给awk,不会解析其中的
[]等特殊字符。 - 针对含[]的匹配模式转义:如果要匹配的起始/结束模式本身包含
[](比如acc_comp[0]),需要在awk的正则里对[]加反斜杠转义,同时确保整个awk脚本被单引号包裹。 - 提取指定字段(按需):如果只需要每行的第一个字段(比如示例中的
ram/rom),在awk中添加print $1即可。
示例命令
提取file中level到work之间行的第一个字段
set array = (`awk '/level/{flag=1; next} /work/{flag=0} flag {print $1}' file`)
执行后array的值就是(ram rom design),符合期望。
提取file2中level到work之间的行(含[]的行)
set array = (`awk '/level/{flag=1; next} /work/{flag=0} flag {print $1}' file2`)
得到的array为(acc_comp[0] acc_comp[1] pin[0])。
若要匹配含[]的起始模式(比如从acc_comp[0]开始提取)
set array = (`awk '/acc_comp\[0\]/{flag=1; next} /work/{flag=0} flag {print $1}' file2`)
这样就能正确匹配acc_comp[0]作为起始行。
内容的提问来源于stack exchange,提问作者Itsme
相关产品推荐
相关产品推荐

