使用linux命令的特定字符串替换

时间:2013-11-06 12:50:12

标签: linux unix sed

我的数据如下:

<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .

现在我想将此数据转换为以下格式:

<text1> <text2> <some text0>.
<text3> <text4> <some text1>.

我知道我可以使用C ++来做到这一点,但有没有办法使用linux做到这一点。我知道sed很擅长替换字符...但我不知道如何使用sed来替换上面的表单。

5 个答案:

答案 0 :(得分:2)

这个单行程适用于您的示例:

kent$  awk '!/\.$/{s=$0;next}sub(/\.$/,s".")' f
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.

解释:

awk               #the program
!/\.$/{s=$0;next} #if the line was not ending with dot(.),
                  #assign it to s, read next line
sub(/\.$/,s".")   #we are here when the line ends with ".",
                  #then we replace ending "." with s, and print.
f                 #the input file

答案 1 :(得分:2)

sed "N;s/\(.*\)\n\(.*\) \.$/\2 \1./" YourFile

默认情况下,sed一次读取1行到工作缓冲区,并在流程结束时打印内容,从下一行开始处理。

N:向缓冲区添加\ n而不是加载下一行输入

s/Part1/Part2/:开始缓冲区直到\ n,\ n比所有内容都要好。在结束之前($)并以不同的顺序重写它\ 1 \ 2分别是第1组和第2组的内容(组是在s / Part1 / Part2 /的第一部分(和)之间找到匹配元素的内容) p>

请注意,这里使用的\主要用于转义下一个char,因为“和”之间的shell替换。意思是“点”

答案 2 :(得分:0)

使用gawk重新定义记录分隔符:

$ awk 'NR>1{print $1,$2,R $3}{R=RT}' RS='<some text[^>]>' file
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.

答案 3 :(得分:0)

我会使用awk,但这是一个很长的对比管道

sed 's/\.$//' <<END | tac | paste -d " " - - | tac | sed 's/$/./'
<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .
END    sed 's/\.$//' <<END | tac | paste -d " " - - | tac | sed 's/$/./'
<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .
END
<text1> <text2>  <some text0>.
<text3> <text4>  <some text1>.

答案 4 :(得分:0)

简单易懂awk

awk '{a=$0;getline;b=$NF;$NF="";print $0 a b}'
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.

a=$0将第一行存储在变量agetline获取下一行 b=$NF将最后一个字段存储在b.)中 $NF=""清除最后一个字段 print $0 a b打印此行,上一行和b.