【问题标题】:How to add a new line to the beginning and end of every line matching a pattern?如何在与模式匹配的每一行的开头和结尾添加新行?
【发布时间】:2017-12-17 08:10:58
【问题描述】:

如何使用sed 在匹配%%### 模式的每一行的开头和结尾添加\n?这是我走了多远:

如果foo.txt 包含

foobar
%%## Foo
%%### Bar
foobar

然后sed 's/^%%###/\n&\n/g' foo.txt 给出

foobar
%%## Foo

%%###
 Bar
foobar

而不是

foobar
%%## Foo

%%### Bar

foobar

注意:这似乎与this post有关

更新:我实际上是在寻找仅考虑以模式开始的行的情况。

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    使用 GNU sed:

    sed 's/.*%%###.*/\n&\n/' file
    

    输出:

    富吧 %%## 富 %%### 酒吧 富吧

    &: 引用模式空间中匹配的那部分

    如果您想“就地”编辑文件,请使用 sed 的选项 -i

    【讨论】:

    • 嗨,谢谢。您是否有仅将 starting 行与模式匹配的版本?
    • 将第一个 .* 替换为 ^
    • @MariusHofert 如果输入包含 2 个连续的 %%### 行,则它们之间将输出 2 个空行。这真的是你想要的吗?即使周围的行已经是空白的,它也会添加空白行。需要考虑的事情...
    【解决方案2】:

    通过sed直接添加换行很麻烦。但是,如果您有 perl 可用,这是一种选择:

    $ foo.txt | perl -pe 's/(.*%%###.*)/\n$1\n/'
    

    这里我们捕获每个匹配的行,它被定义为任何包含%%### 模式的任何行,然后我们用前导和尾随换行符包围的行替换。

    【讨论】:

    • 怎么比the sed solution少麻烦?
    • @EdMorton 我在几个地方读到从 SED 生成换行符有一些警告。这个答案似乎很合理。
    • 唯一需要注意的是,一些 seds 不接受 \n 作为换行符,您需要反斜杠后跟一个文字换行符或依赖 shell 来扩展 $'\n' 但如果你有或者可以安装 perl 然后你有或者可以安装一个接受 \n 的 sed。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '/%%###/!b;G;i\\' file
    

    对于那些符合条件的行,从保留空间追加一个换行符(保留空间默认包含一个换行符)并插入一个空行。

    另一种方式:

    sed -e '/%%###/!b;i\\' -e 'a\\' file
    

    这次插入然后追加空行。

    注意ia 必须后跟换行符,这可以通过将它们放在单独的 -e 调用中来实现。

    第三种方式:

    sed '/%%###/!b;G;s/.*\(.\)/\1&/' file
    

    与第一种方式一样,从保留空间添加一个换行符,然后将其复制,即修改后的当前行的最后一个字符,并将其添加到当前行。

    另一种方式:

    sed '/%%###/{x;p;x;G}' file
    

    交换到保留空间,打印换行符,换回并附加换行符。

    注意如果保留空间可能不是空的(以前的,xhHgG 命令可能已更改它)缓冲区可能会在打印之前被清除(p ) 通过使用 zap 命令z

    当然还有:

    sed  '/%%###/s/^\|$/\n/g' file
    

    【讨论】:

      【解决方案4】:

      我个人会使用字符串而不是正则表达式比较,因为您要匹配的文本中没有表示表达式的字符,如果存在您不希望它们被这样对待,只需在字符串周围打印换行符而不是修改字符串本身:

      awk '{print ($1=="^%%###" ? ORS $0 ORS : $0)}' file
      

      以上内容适用于每个 UNIX 机器上的每个 shell 中的任何 awk,如果您不希望在连续的 %%### 行之间有多个空行,或者如果现有的周围行不希望添加空行,则可以轻松修改已经为空,或者您需要执行其他操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 2014-02-18
        相关资源
        最近更新 更多