2016-11-29 92 views
-1

我想用一段代码替换一行代码string1。 我可以用一个sed命令做到这一点:用多行代码替换单行代码,反之亦然

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

代码可以覆盖三排。但是,我们的代码风格要求代码必须位于每行中的某些列下。为了格式化,我使用“Enter”键按下。看起来“Enter”按键会导致“未终止的s命令”错误。

有没有什么好的bash命令来做到这一点?

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

+0

真正的问题是我想做出“多线sed表达式”的工作。喜欢在sed表达中包含行连续。当我使用“\”作为连线时。它没有终止'命令错误。谢谢 – nathan

回答

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); 
} 

有了一点回旋的编码你可以EV在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.你可以,只要你用反斜杠分别逃脱他们作为 \$\%\*有特殊字符,如$%*在替换式。

+1

是的,我知道。我的观点并不是'\ n'。问题是我的代码太长,无法使用3,4行。而格式是丑陋的。我的sed命令将在if子句下。所以在“sed”之前有一个缩进。然而,剩余的2条或3条线将从该线的一开始就开始,这是非常可怕的风格。我真正的问题是如何格式化sed命令 – nathan

+0

@ user3529352只需使用反斜杠转义换行符。看看我编辑了最后一个例子。 –

+0

sed -i“s | string1 | \ line1 \ n \ line2 \ n \ line3 | g”afg。这不起作用。错误:sed:-e表达式#1 ..未终止的's'命令 – nathan