如何删除左括号后的换行符?awk、sed实现遇阻求助
解决行尾左括号后换行符的删除问题
你需要实现的是删除行尾为左括号时的换行符,让下一行内容直接衔接在左括号后,比如把one two(\nthree转换成one two(three对吧?先分析你之前尝试的命令问题,再给出正确的解决方案:
为什么你之前的命令没生效?
- 你的sed命令
sed 's/($/(/g'只是替换了行尾的(为(,根本没处理换行符,自然达不到效果。 - 你的awk命令
awk '/\($/ {printf "%s ", $0} {print; next}'逻辑有问题:匹配行尾(的行执行printf后,又执行了print,导致该行内容被重复输出,还额外加了空格,不符合需求。
正确的Sed解决方案
使用Sed的循环和模式空间操作来处理,命令如下:
sed ':a; /($/{N; s/(\n/(/; ba}' input.txt
命令解释:
:a:定义一个名为a的标签,用于循环跳转/($/:匹配行尾为左括号的行N:将下一行内容读取到当前模式空间中,此时模式空间里是行内容(\n下一行内容s/(\n/(/:把模式空间里的(+换行符替换成(,实现内容衔接ba:跳转到标签a,继续循环处理(避免出现连续多行尾都是(的情况)
正确的Awk解决方案
用Awk控制输出的换行时机,命令如下:
awk '/\($/{printf "%s", $0; next} {print}' input.txt
命令解释:
/\($/:匹配行尾为左括号的行printf "%s", $0:不带换行符输出当前行内容next:跳过后续的print语句,避免输出换行{print}:对不匹配的行,正常输出(自带换行符)
测试示例
假设输入文件input.txt内容为:
one two( three four( five six seven( eight
执行上述任意命令后,输出结果为:
one two(three four(five six seven(eight
内容的提问来源于stack exchange,提问作者yorgo
相关产品推荐
相关产品推荐

