命令行:替换换行符后跟字符

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*\&lt;|&lt;|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 我在问题中添加了预期的输出。我的文件中有很多新行,但我只想加入 &lt; 开头的行(之前有可选空格。所以 FIRST LINE另一行应该保留。 可以简单如perl -0777 -pe "s/\n\s*(&lt;)/$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*([&lt;']):匹配 0+ 个水平空格,后跟 1+ 个换行符,然后是 0+ 个空格和 &lt;'。请注意,我们在组#1 中捕获&lt;'。用 &lt;' 替换此匹配项,这是我们在第 1 组中捕获的

【讨论】:

非常感谢!我刚刚将您的命令编辑到此perl -0777 -pi -e "s/\h*\R+\h*&lt;/&lt;/g" 以将&lt; 添加回原来的位置:) 效果很好。 实际上这可以通过使用捕获组来缩短。请查看我的更新答案。

以上是关于命令行:替换换行符后跟字符的主要内容,如果未能解决你的问题,请参考以下文章

如何用 <br/> 替换某些回车换行符后跟破折号?

Notepad++替换格式符号(如换行符Tab符等)

sed多行模板替换

将文字反斜杠后跟一个字符转换为相应的转义序列

VSCode将某个字符替换为换行符 并换行显示

java 将字符串中的回车换行符替换为HTML中的换行标签点击