如何通过Linux命令移除引号与HEX分隔符间的换行符?
移除引号内换行符的Linux命令推荐
需求说明
需要移除HEX分隔符与引号之间、且位于引号包裹的data2内容里的换行符,将引号内的多行文本合并为单行。
示例输入
data1 HEX "This data2 should be in the same line" HEX data3
期望输出
data1 HEX "This data2 should be in the same line" HEX data3
推荐解决方案
方案1:使用sed命令
这是处理这类跨行文本替换的常用工具,命令如下:
sed -e ':a' -e '/"$/!{N;ba' -e '}' -e 's/\n/ /g' input.txt
命令逻辑:
:a定义循环标签a/"/$!{N;ba}若当前行未以引号结尾,就读取下一行追加到当前行,然后跳回标签a继续循环,直到捕获到完整的引号块s/\n/ /g将捕获到的多行引号块里的换行符全部替换为空格
如果需要直接修改原文件,添加-i参数即可:
sed -i -e ':a' -e '/"$/!{N;ba' -e '}' -e 's/\n/ /g' input.txt
方案2:使用awk命令
awk通过标记切换来识别引号块,实现换行替换:
awk '/"/{flag=!flag} flag{gsub(/\n/," "); printf "%s", $0; next} 1' input.txt
命令逻辑:
/"/{flag=!flag}遇到引号时,切换flag的状态(进入或退出引号区域)flag{gsub(/\n/," "); printf "%s", $0; next}处于引号区域内时,将换行符替换为空格,用printf避免自动换行,持续输出合并后的内容1非引号区域的行直接正常输出
内容的提问来源于stack exchange,提问作者JIAHAO
相关产品推荐
相关产品推荐

