按内容删除最后两行

按内容删除最后两行

我有一个如下所示的文本文件:

    FD488AFF,
    FED6ECFF,
    FFA2A2FF,
    FFD7D8FF,
(
)

最后一个字符之后还有一个换行符)。我正在使用 macOS 终端并寻找一种方法来删除最后一个逗号, 这,以及最后一个,以及返回其后的字符

,
(
)

以及最后一个字符后面的新行字符性格,但我似乎无法让它发挥作用。我不必使用sed,但它确实需要使用终端。

答案1

反转文件,删除前 2 行并删除第 3 行的逗号。然后重新反转结果。

tac file | sed '1,2d; 3s/,$//' | tac

保存回同一个文件:

... | tac > tmp && mv tmp file

或者,使用包sponge中的moreutils

... | tac | sponge file

再想一想,这将是一个很好的方法:ed 实际上是一个文件编辑器这样您就可以进行编辑并保存。

ed file <<'END'
$-1,$d
$s/,$//
wq
END

答案2

不是最有效的,但应该可以完成工作:

sed '$d' file | sed '$d' | sed '$s/,$//'
    FD488AFF,
    FED6ECFF,
    FFA2A2FF,
    FFD7D8FF

答案3

要删除最后两行(如果它们分别包含左括号和右括号以及它们前面的逗号),您可以使用滑动窗口:

sed  '1N;$!N;${
s/,\n(\n)//
}
P;D' infile

N当在st 线上时,这会拉入一条ew 线1,然后它总是在模式空间中保留三行(通过N;P;D cycle)。当到达 la $t 行时,它会尝试1删除一个逗号,后跟一个\newline、a (、另一个\newline 和 a)


1:无需在此处锚定,因为模式空间中任何时候都不能超过三行

答案4

按内容删除最后两行

参见@LewisM的回答https://unix.stackexchange.com/a/483043/4778

按位置删除最后两行,并从末尾删除第三行的逗号。

< «file-name»  head -n -2 | sed -r -e '$ s/,$//'

或者

< «file-name»  sed -nr -e 'x;${d;x;d};1d;p' | sed -r -e '$ s/,$//'

相关内容