如何用sed删除指定位置的换行符?实操遇阻求解决方案
问题:删除文本中特定位置的换行符
原始输入文本:
Code=200]:[ (381_3544|null|https_//cdn10.connected-stories.com)( Penn State World Campus - San Deigo |TV)]:677:01:SUCCESS 20220929010707:[url=https_//rtr.innovid.com/r1.62b49edb185030.50315160;cb=1372882909, breakId=1
想要得到的输出:
Code=200]:[ (381_3544|null|https_//cdn10.connected-stories.com)(Penn State World Campus - San Deigo|TV)]:677:01:SUCCESS 20220929010707:[url=https_//rtr.innovid.com/r1.62b49edb185030.50315160;cb=1372882909, breakId=1
尝试过的命令:
sed -ie "s/San Deigo\n/San Deigo/g"
该命令无效果,使用-z选项时会删除所有换行,将所有内容合并到第一行,求正确的解决办法。
解决方法
可以利用sed的多行处理能力,精准匹配需要删除的换行位置:
方法一:sed命令
sed -e '/)$/{N;s/(\n\s*/(/;s/Deigo\n\s*/Deigo/}' 你的文件名.txt
如果需要直接修改原文件,添加-i选项:
sed -ie '/)$/{N;s/(\n\s*/(/;s/Deigo\n\s*/Deigo/}' 你的文件名.txt
命令说明:
/)$/:定位到以)结尾的行(也就是第一行)N:把下一行追加到当前处理的行中,实现多行合并处理s/(\n\s*/(/:将(后面的换行符和所有空白字符替换成单个(s/Deigo\n\s*/Deigo/:将Deigo后面的换行符和所有空白字符替换成Deigo
方法二:awk命令
如果更习惯用awk,也可以这样写:
awk 'NR==1{buf=$0;next} NR==2{buf=buf $0; gsub(/\(\n\s*/,"(",buf); gsub(/Deigo\n\s*/,"Deigo",buf); print buf} NR>=3{print}' 你的文件名.txt
为什么之前的命令无效?
- 你之前的sed命令无效,是因为sed默认按单行处理,
\n在单行模式下无法匹配实际的换行符,必须通过N等命令启用多行模式后才能处理跨行内容。 -z选项会把整个文件读成一个无换行的长字符串,所以会删掉所有换行,不符合只删除特定位置换行的需求。
内容的提问来源于stack exchange,提问作者juniorcoder
相关产品推荐
相关产品推荐

