sed命令复习
sed显示文件的倒数第二行:(以下三种方法都可以)
sed -e '$!{h;d;}' -e x file.txt
sed -n 'x;$p' file.txt
sed 'x;$!d' file.txt
加上for循环,批量显示每个文件的倒数第二行
for i in `ls *.log` ;do sed 'x;$p' -n $i ;done
sed打印偶数行::::::::::::::::
sed -n 'n;p' t
sed打印奇数行::::::::::
sed -n '$!N;P' t
sed 'n;d' t
sed模式互换,数据相互替换:
sed 有许多的函数参数。不过今天主要讲 5 个,即 h ,H,g,G,x
函数参数 h
表示将模式空间(pattern space)的数据行 复制 到保持空间(hold space)。
函数参数 H
表示将模式空间(pattern space)的数据行 附加 到保持空间(hold space)。
函数参数 g
表示将保持空间(hold space)的数据行 复制 到模式空间(pattern space)。
函数参数 G
表示将保持空间(hold space)的数据行 附加 到模式空间(pattern space)。
以上四个参数都比较简单,下面重点介绍函数参数 x:
函数参数 x
表示将模式空间(pattern space)与保持空间(hold space)内的内容互相交换。举个例子,我要将下面数据行的第 1 行和第 3 行互换。
sed -e '1h' -e '3x' t.log
上面例子中,1h 表示当数据行进入 pattern space 后,第 1 行的数据就复制到 hold space。然后输出 pattern space 的内容,直到第 3 行,由于有 3x 参数,表示将 pattern
space 的第 3 行与 hold space 的数据行交换。那么此时输出的 pattern space 的第 3 行 实际上就是 hold space 的第 1 行数据,即 The。余下的行未作处理,按原来顺序输出。
这样,就完成了第 1 行与第 3 行的交换。
##############################################
我必须在文件的倒数第二行 - file.txt 上用“字符串”替换“模式”。
以下三个 sed 命令能够打印倒数第二行。但我需要用“字符串”替换“模式”。有什么帮助吗??
sed -e '$!{h;d;}' -e x file.txt
sed -n 'x;$p' file.txt
sed 'x;$!d' file.txt
$ cat file.txt
cabbage
spinach
collard greens
corn salad
Sweet pepper
kale
如何替换文件的倒数第二行(甜椒):
一种。如果倒数第二行包含“甜椒”,则将“甜”替换为“绿色”
湾用“胡萝卜”替换整行,无论它包含什么
最佳答案
将倒数第二行的 Sweet 更改为 Green,但前提是该行包含 Sweet pepper
:
$ sed 'x; ${/Sweet pepper/s/Sweet/Green/;p;x}; 1d' file.txt
cabbage
spinach
collard greens
corn salad
Green pepper
kale
要将倒数第二行的整个内容(无论其包含什么内容)替换为胡萝卜:
$ sed 'x; ${s/.*/carrots/;p;x}; 1d' file.txt
cabbage
spinach
collard greens
corn salad
carrots
kale
这个怎么运作
让我们用这个命令一步一步地检查它:
sed 'x; ${s/.*/carrots/;p;x}; 1d'
x
这交换了模式空间(保存最近读取的行)和保持空间。
完成后,保持空间将包含最近读取的行,模式空间将包含前一行。
(异常(exception)情况是我们刚读完第一行。在这种情况下,保持空间将包含第一行,而模式空间将为空。)${s/.*/carrots/;p;x}
当我们在最后一行时,由$
指示,模式空间保存倒数第二行,我们可以执行任何我们喜欢的替换或其他命令。完成后,我们用p
打印倒数第二行.最后,我们交换模式并再次使用x
保持空间这样模式空间将再次包含最后一行。sed
将打印此信息,因为默认情况下,在命令末尾,sed
打印模式空间中的任何内容。1d
当我们在第一行时,由1
表示,模式空间是空的(因为没有前一行),我们将其删除(d
)。
一个更简单的方法
这种方法很容易理解,代价是执行速度较慢:
$ tac file.txt | sed '2 {/Sweet pepper/s/Sweet/Green/}' | tac
cabbage
spinach
collard greens
corn salad
Green pepper
kale
而且,对于胡萝卜:
$ tac file.txt | sed '2 s/.*/carrots/' | tac
cabbage
spinach
collard greens
corn salad
carrots
kale
工作原理:在这里,我们使用
tac
颠倒行的顺序。观察:$ tac file.txt
kale
Sweet pepper
corn salad
collard greens
spinach
cabbage
这样,倒数第二行成为第 2 行。因此,我们只需告诉 sed 对第 2 行进行操作。之后,我们使用
tac
再次放置线条,但顺序正确。
关于sed - 替换文件倒数第二行的 "pattern",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38649053/