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 '$p' 172.18.136.11_property.log 

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/

posted @ 2023-10-09 09:31  往事已成昨天  阅读(72)  评论(0编辑  收藏  举报