如何使用sed交换两行?

时间:2010-10-21 21:22:55

标签: linux sed

是否有人知道如何使用sed编辑器在文本文件中将line aline bline b替换为line a

我可以看到如何用保持空间中的一条线(即/^Paco/x/^Paco/g)替换模式空间中的一条线,但是如果我想要开始这条线怎么办?使用Paco并将其替换为以Vinh开头的行,并将该行替换为Vinh,并将其替换为以Paco开头的行?

我们假设初学者有一行Paco和一行Vinh,行[{1}}出现在行Paco之前。然后我们可以转到一般情况。

4 个答案:

答案 0 :(得分:3)

#!/bin/sed -f
/^Paco/ {
:notdone
  N
  s/^\(Paco[^\n]*\)\(\n\([^\n]*\n\)*\)\(Vinh[^\n]*\)$/\4\2\1/
  t
  bnotdone
}

匹配后/ ^ Paco /我们读入模式缓冲区直到s //成功(或EOF:模式缓冲区将保持不变)。然后我们开始搜索/ ^ Paco /.

答案 1 :(得分:2)

cat input | tr '\n' 'ç' | sed 's/\(ç__firstline__\)\(ç__secondline__\)/\2\1/g' | tr 'ç' '\n' > output

__firstline____secondline__替换为所需的正则表达式。请务必使用.替换正则表达式中[^ç]的任何实例。如果您的文字中实际包含ç,请替换为您的文字没有的其他内容。

答案 2 :(得分:0)

GNU sed texinfo doc中的一个简单示例:

Note that on implementations other than GNU `sed' this script might
easily overflow internal buffers.

 #!/usr/bin/sed -nf

 # reverse all lines of input, i.e. first line became last, ...

 # from the second line, the buffer (which contains all previous lines)
 # is *appended* to current line, so, the order will be reversed
 1! G

 # on the last line we're done -- print everything
 $ p

 # store everything on the buffer again
 h

答案 3 :(得分:0)

试试这个awk脚本。

s1="$1"
s2="$2"
awk -vs1="$s1" -vs2="$s2" '
{ a[++d]=$0 }
$0~s1{ h=$0;ind=d}
$0~s2{
 a[ind]=$0
 for(i=1;i<d;i++ ){ print a[i]}
 print h
 delete a;d=0;
}
END{ for(i=1;i<=d;i++ ){ print a[i] } }' file

输出

$ cat file
1
2
3
4
5

$ bash test.sh 2 3
1
3
2
4
5

$ bash test.sh 1 4
4
2
3
1
5

使用sed(或根本不使用)仅用于简单替换。更复杂的是,使用编程语言