用多行代码替换单行,反之亦然

时间:2016-11-29 15:38:31

标签: shell sed

我想用一段代码替换单行string1。 我可以使用sed命令来完成它:

sed -i "s|..|a very long code|g"

代码可以覆盖三行。但是,我们的代码样式要求代码必须位于每行的某些列下。对于格式化,我使用"输入"按键。似乎"输入"按键会导致"未终止的s命令"错误。

有没有好的bash命令呢?

另外,如何用一行替换这个多行代码?该代码包含一些%*和一些正则表达式字符。似乎模式空间不应该有它们。

1 个答案:

答案 0 :(得分:2)

使用\n表示换行符。

:~> sed "s|string1|#include \"test.h\"\n#include \"release.h\"|g"

会打印

#include "test.h"
#include "release.h"

您可以根据需要输入空格

:~> echo sleep100 | sed "s|sleep100|\
for (int i=0; i< 100; i++){\n\
sleep(1);\n}|g"

会打印格式化的循环结构

for (int i=0; i< 100; i++){
   sleep(1);
}

通过一些迂回编码,你甚至可以在sed命令的每一行的开头保留必要数量的空格。

:~> bs4="$(printf '%b' '\b' '\b' '\b' '\b')" ;\
    echo sleep100 | sed "s|sleep100|\
    ${bs4}for (int i=0; i< 100; i++){\n\
    sleep(1);\n}|g"

诀窍的本质是克服sed的限制,解释\b以不同的方式逃脱。我们不是使用转义序列,而是设置实际的退格字符来吞噬额外的空格。

P.S。只要您使用反斜杠转义它们,替换表达式中就可以包含$%*等特殊字符 分别为\$\%\*