命令行:替换换行符后跟字符
Posted
技术标签:
【中文标题】命令行:替换换行符后跟字符【英文标题】:command line: replace newline followed by character 【发布时间】:2020-12-16 04:42:33 【问题描述】:我想替换文件中的换行符\n
仅当下一行以可选空格开头并且小于字符\s*<
。
示例文本:
FIRST LINE ('<foo>
<bar>
<baz>')
ANOTHER LINE 'lorem ipsim', '<dolor>
<and>
<p>again</p>
</and>
</dolor>'
我需要在命令行上使用 sed、perl、tr、...
我尝试了几个命令,但到目前为止没有一个有效。
基本上就是:sed -i -e 's|\n+\s*\<|<|gm' filename
看起来 sed 看起来并不比换行符更远。
https://regex101.com/r/VkRO9o/3
有什么命令可以做到吗?
编辑:预期输出:
FIRST LINE '<foo> <bar><baz>'
ANOTHER LINE 'lorem ipsim', '<dolor><and><p>again</p></and><dolor>'
空格不换也没关系。
【问题讨论】:
@anubhava 我在问题中添加了预期的输出。我的文件中有很多新行,但我只想加入<
开头的行(之前有可选空格。所以 FIRST LINE 和 另一行应该保留。
可以简单如perl -0777 -pe "s/\n\s*(<)/$1/g" input.txt
【参考方案1】:
您可以为此使用perl
:
perl -0777 -pe "s/\h*\R+\h*([<'])/\$1/g" file
FIRST LINE ('<foo><bar><baz>')
ANOTHER LINE 'lorem ipsim', '<dolor><and><p>again</p></and></dolor>'
RegEx Demo
详情:
-0777
:启用 slurp 模式以匹配换行符
/\h*\R+\h*([<'])
:匹配 0+ 个水平空格,后跟 1+ 个换行符,然后是 0+ 个空格和 <
或 '
。请注意,我们在组#1 中捕获<
或'
。用 <
或 '
替换此匹配项,这是我们在第 1 组中捕获的
【讨论】:
非常感谢!我刚刚将您的命令编辑到此perl -0777 -pi -e "s/\h*\R+\h*</</g"
以将<
添加回原来的位置:) 效果很好。
实际上这可以通过使用捕获组来缩短。请查看我的更新答案。以上是关于命令行:替换换行符后跟字符的主要内容,如果未能解决你的问题,请参考以下文章