用文本文件最后两行的最后一个单词中的另一个字母替换一个字母

Mar*_*sie 16 awk sed

我怎么可能用另一个字符替换一个字符,从 shell 中文本文件的最后两行中选择最后一个单词,只使用一个命令?在我的情况下,只替换最后一个单词中出现的aE

就像,从包含这个的文本文件:

tree;apple;another
mango.banana.half
monkey.shelf.karma
Run Code Online (Sandbox Code Playgroud)

对此:

tree;apple;another
mango.banana.hElf
monkey.shelf.kErmE
Run Code Online (Sandbox Code Playgroud)

我尝试使用sed -n 'tail -2 'mytext.txt' -r 's/[a]+/E/*$//'但它不起作用(我的错误:)sed expression #1, char 10: unknown option to 's

Rav*_*h13 8

您能否尝试以下,tac+awk解决方案。完全基于 OP 的样本。

tac Input_file | 
awk 'FNR<=2{if(/;/){FS=OFS=";"};if(/\./){FS=OFS="."};gsub(/a/,"E",$NF)} 1' | 
tac
Run Code Online (Sandbox Code Playgroud)

显示样本的输出是:

tree;apple;another
mango.banana.hElf
monkey.shelf.kErmE
Run Code Online (Sandbox Code Playgroud)

注意:如果您只想替换最后一个字段中第一次出现的字符,请更改gsub为。suba


pot*_*ong 5

这可能对你有用(GNU sed):

sed -E 'N;${:a;s/a([^a.]*)$/E\1/mg;ta};P;D' file
Run Code Online (Sandbox Code Playgroud)

通过使用N将下一行附加到前一行并使用PD命令打印然后删除其中的第一行,在整个文件长度中打开一个两行窗口。因此在文件的末尾,由$地址表示的最后两行将出现在模式空间中。

使用m上的取代命令多行标志,以及所述g全局标志和之间的环:ata,替换任何a在最后一个字(由分隔.用)E

因此,替换命令的第一遍将替换ainhalf和最后一个ain karma。下一次传递将不匹配倒数第二行中的任何内容并替换ain karmE。第三遍将不匹配任何内容,因此ta命令将失败,最后两​​行将打印所需的更改。