Bash脚本提取文件坐标列时如何保留原有空格格式?
解决Bash提取坐标区段时丢失空格的问题
首先,你的核心需求是从文件中提取&COORD到&END COORD之间的坐标内容,并且完全保留原始格式(包括空格)。原来的方法用了多层grep和变量存储,容易因为shell的单词拆分导致空格丢失,其实用awk就能一步搞定,而且完美保留格式。
推荐方案:直接用awk精准提取区段
awk天生擅长处理这种"开始-结束"的区段提取,而且会原封不动保留每行的格式:
1. 包含&COORD和&END COORD标记行
如果需要把这两个标记行也一起提取:
awk '/&COORD/,/&END COORD/ {print}' "$cpki_file" > target_coords.txt
2. 只提取中间的坐标行(不含标记行)
如果只需要红色标记的坐标内容,排除两个标记行:
awk '/&COORD/ {flag=1; next} /&END COORD/ {flag=0} flag' "$cpki_file" > target_coords.txt
这个命令的逻辑很清晰:
- 当匹配到
&COORD时,开启标记flag=1,并跳过当前行(不打印标记行) - 当匹配到
&END COORD时,关闭标记flag=0 - 只要
flag为1,就打印当前行(也就是两个标记之间的所有坐标行)
为什么原来的方法会丢失空格?
你原来的代码把提取的内容存到COORD变量后,再用awk处理时,犯了一个常见的shell错误:如果直接把变量作为awk的参数(比如awk '{...}' $COORD),shell会按照默认的分隔符(空格、制表符、换行)把变量内容拆分成多个单词,传给awk的是零散的单词,而不是完整的行。
如果一定要沿用原来的grep思路,需要把变量内容作为输入流传给awk,比如:
# 先提取内容到变量 N=200 NEndCoord=$(grep -B${N} '&END COORD' "${cpki_file}" | wc -l) NCoord=$(grep -B${N} '&END COORD' "${cpki_file}" | grep -B200 '&COORD' | wc -l) let i=$NEndCoord-$NCoord COORD=$(grep -B${i} '&END COORD' "${cpki_file}") # 正确传递变量内容给awk,保留格式 echo "$COORD" | awk '{print}' > target_coords.txt
注意这里用了echo "$COORD"(引号必须加!),这样shell会把变量内容作为一个整体输出,保留所有空格和换行,再传给awk处理。
不过还是推荐直接用awk的区段提取方法,更简洁高效,也避免了多层grep可能带来的错误(比如当文件中有多个&COORD或&END COORD时,grep的-B参数可能会匹配到错误的内容)。
内容的提问来源于stack exchange,提问作者Alam
相关产品推荐
相关产品推荐

