gpt4 book ai didi

sed - 替换文件倒数第二行的 "pattern"

转载 作者:行者123 更新时间:2023-12-04 22:19:27 36 4
gpt4 key购买 nike

我必须在文件的倒数第二行 - 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/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com