如何使用 sed 删除字符串上方和下方的换行符?

Joh*_*L_. 0 command-line sed text-processing

我想将文件中所有出现的\ntoken1\n和更改\ntoken2\ntoken1和)。token2

我以为这样就可以了:

${
N
N
s/\ntoken1\n/token1/
s/\ntoken2\n/token2/
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。

预先感谢您的任何澄清。

ste*_*ver 8

您可以考虑使用非流式编辑器,而不是将问题视为多行替换它提供了连接命令并支持相对地址。前任。给定

$ cat file
abc
def
token1
ghi
jkl
token2
mno
pqr
Run Code Online (Sandbox Code Playgroud)

那么您可以全局选择标记匹配,然后每个标记与前一行和后一行连接起来:

$ printf '%s\n' 'g/token1\|token2/-1,+1j' ,p Q | ed -s file
abc
deftoken1ghi
jkltoken2mno
pqr
Run Code Online (Sandbox Code Playgroud)

(如果您的令牌确实如此token1token2您可以将正则表达式简化为token[12])。

要就地编辑,请将,p Q(打印然后无条件退出)替换为wq(写入并退出)。


如果必须使用 sed,那么一种方法是实现循环:

$ sed -E -e :a -e 'N;s/\n(token1|token2)\n/\1/' -e '/\n.*\n/!ba' -e 'P;D'  file
abc
deftoken1ghi
jkltoken2mno
pqr
Run Code Online (Sandbox Code Playgroud)

这里,/\n.*\n/!ba测试模式空间是否包含两个换行符(即三行长),如果不包含,则循环返回并添加另一行;否则在循环之前P;D打印并删除一行。它们一起维护一个 3 行滑动窗口来应用替换。


注意:您还没有提供测试用例,特别是您没有指出在“\ntoken1\n”和“\ntoken2\n”重叠的情况下所需的行为。应该
def
token1
ghi
token2
Run Code Online (Sandbox Code Playgroud)

变得

deftoken1ghitoken2
Run Code Online (Sandbox Code Playgroud)

或者

deftoken1ghi
token2
Run Code Online (Sandbox Code Playgroud)

  • @JasonNordwick 谢谢;)我想我应该注意到“ed”将整个文件加载到内存中,因此可能不是处理大文件的最佳选择(尽管使用“sed -z”的解决方案也是如此) (3认同)