Joh*_*L_. 0 command-line sed text-processing
我想将文件中所有出现的\ntoken1\n
和更改\ntoken2\n
为token1
和)。token2
我以为这样就可以了:
${
N
N
s/\ntoken1\n/token1/
s/\ntoken2\n/token2/
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。
预先感谢您的任何澄清。
您可以考虑使用非流式编辑器,而不是将问题视为多行替换,它提供了连接命令并支持相对地址。前任。给定
$ 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)
(如果您的令牌确实如此token1
,token2
您可以将正则表达式简化为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 行滑动窗口来应用替换。
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)