我怎么可能用另一个字符替换一个字符,从 shell 中文本文件的最后两行中选择最后一个单词,只使用一个命令?在我的情况下,只替换最后一个单词中出现的a与E。
就像,从包含这个的文本文件:
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。
您能否尝试以下,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
这可能对你有用(GNU sed):
sed -E 'N;${:a;s/a([^a.]*)$/E\1/mg;ta};P;D' file
Run Code Online (Sandbox Code Playgroud)
通过使用N将下一行附加到前一行并使用P和D命令打印然后删除其中的第一行,在整个文件长度中打开一个两行窗口。因此在文件的末尾,由$地址表示的最后两行将出现在模式空间中。
使用m上的取代命令多行标志,以及所述g全局标志和之间的环:a和ta,替换任何a在最后一个字(由分隔.用)E。
因此,替换命令的第一遍将替换ainhalf和最后一个ain karma。下一次传递将不匹配倒数第二行中的任何内容并替换ain karmE。第三遍将不匹配任何内容,因此ta命令将失败,最后两行将打印所需的更改。