Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用linux命令替换特定字符串_Linux_Unix_Sed - Fatal编程技术网

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

使用linux命令替换特定字符串,linux,unix,sed,Linux,Unix,Sed,我有以下格式的数据: <some text0> <text1> <text2> . <some text1> <text3> <text4> . <text1> <text2> <some text0>. <text3> <text4> <some text1>. . . 现在,我想将此数据转换为以下形式: <some text0>

我有以下格式的数据:

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

.
.
现在,我想将此数据转换为以下形式:

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

我知道我可以用C++来做,但是有没有办法使用Linux做这个。我知道sed擅长替换字符……但我不知道如何使用sed替换上述表单。

这一行代码适用于您的示例:

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

这一行代码适用于您的示例:

kent$  awk '!/\.$/{s=$0;next}sub(/\.$/,s".")' f
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
sed默认情况下一次读取一行到工作缓冲区,并在进程结束时从下一行开始打印内容

N
:在缓冲区中添加一个\N,然后加载下一行输入

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

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

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

N
:在缓冲区中添加一个\N,然后加载下一行输入

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


请注意,此处使用\主要用于转义下一个字符,因为“”和“”之间的shell替换。通过使用gawk重新定义记录分隔符来表示“点”:

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

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

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

我会使用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

sed's/\.$/'我会使用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

sed's/\.$/'简单易懂
awk

awk '{a=$0;getline;b=$NF;$NF="";print $0 a b}'
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
awk'{a=$0;getline;b=$NF;$NF=”“;print$0 a b}'
.
.
a=$0
将第一行存储在变量
a

getline
获取下一行
b=$NF
将最后一个字段存储在
b
$NF=”“
清除最后一个字段
打印$0ab
打印这一行、前一行和
b

简单易懂的
awk

awk '{a=$0;getline;b=$NF;$NF="";print $0 a b}'
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
awk'{a=$0;getline;b=$NF;$NF=”“;print$0 a b}'
.
.
a=$0
将第一行存储在变量
a

getline
获取下一行
b=$NF
将最后一个字段存储在
b
$NF=”“
清除最后一个字段
print$0ab
打印这一行、前一行和
b

自己看:一次执行一点,看看它是什么样子:
sed's/\.$/'文件
然后
sed's/\.$/'文件| tac
然后
sed's/\.$/'文件| tac |粘贴-d”“-
等等。之后,阅读手册页面:,与请求相比,etcAn在
之间有额外的空间请自己看:一次执行一点,看看它是什么样子:
sed's/\.$/'file
然后
sed's/\.$/'file;tac
然后
sed/.$/'file;tac;paste-d”“-
等等。然后,阅读手册页面:,与我多次阅读的请求相比,etcAn额外的空间介于
之间
getline在正确使用时很好
<代码>getline在正确使用时正常