Linux下移除固定长度文件中无前导空格的CRLF(求TR/SED/AWK方案)
问题需求
Linux文件系统中有一个固定长度的输出文件,需要移除其中所有前导无空格的CRLF:文件里有效行的CRLF前都包含多个空格,而需要移除的CRLF前没有空格。此前尝试了多种tr、sed、awk命令均未解决,现寻求可行方案。
已尝试的命令
echo -n $(tr -d "?<-c\x20\r\n" < file) > output.txt echo -n $(tr -d "?<\x20\r\n" < file) > output.txt; (tr -d "\r\n" < file.txt | fold -w 2538;echo) | sed 's/$/\r/' > output.txt awk 'length($0) != 2536 {sub(/\r$/,""); printf "%s", $0; next} {print}' file.txt > output.txt
可行解决方案
方案1:使用awk处理
通过判断行尾字符是否为空格,决定是否保留CRLF:若行尾非空格则移除CRLF并拼接下一行,若为空格则保留原行格式。
awk '{ line = $0 # 移除行尾的\r统一处理 sub(/\r$/, "", line) if (substr(line, length(line), 1) != " ") { # 无空格结尾,不输出换行,拼接下一行内容 printf "%s", line } else { # 有效行,保留原CRLF格式 print line "\r" } }' file.txt > output.txt
方案2:使用sed多行处理
利用sed的多行模式,匹配行尾非空格且带\r的行,将其与下一行合并:
-N ' # 匹配行尾为非空格且带\r的行 /[^ ]\r$/{ N # 移除两行之间的CRLF分隔符 s/\r\n// } p ' file.txt > output.txt
内容的提问来源于stack exchange,提问作者Tracy Chewning
相关产品推荐
相关产品推荐

