KSH:sed命令,用于搜索和替换文件中最后出现的字符串

KSH:sed命令,用于搜索和替换文件中最后出现的字符串,sed,ksh,hp-ux,Sed,Ksh,Hp Ux,我尝试使用sed搜索文件中的最后一个事件。在HP-UX中,tac选项不可用 例如:下面是文件中的数据 A|2121212|666666666 | 2|01|2 |B|1111111111 |234234234 |00001148| B|2014242|8888888888| 3|12|3 |B|22222222222 |45345345 |00001150| C|4545456|4444444444| 4|31|4 |B|3333333333333 |4234234 |00001148| 我正

我尝试使用sed搜索文件中的最后一个事件。在HP-UX中,tac选项不可用

例如:下面是文件中的数据

A|2121212|666666666 | 2|01|2 |B|1111111111 |234234234 |00001148|
B|2014242|8888888888| 3|12|3 |B|22222222222 |45345345 |00001150|
C|4545456|4444444444| 4|31|4 |B|3333333333333 |4234234 |00001148|
我正在努力:

cat $filename | sed 's/00001148/00001147/g'
对于00001148的出现,它从00001148更改为00001147

我必须搜索上次出现的
|00001148 |
,并替换为另一个数字。当前,我的sed命令正在更改00001148的两个实例。

编辑

要匹配最后一行,请使用
$

sed '$s/00001148/00001147/g' $filename 
将输出为

A|2121212|666666666 | 2|01|2 |B|1111111111 |234234234 |00001148|
B|2014242|8888888888| 3|12|3 |B|22222222222 |45345345 |00001150|
C|4545456|4444444444| 4|31|4 |B|3333333333333 |4234234 |00001147|
如果匹配行是文件中的最后一行,请使用
tail
而不是
cat

tail -1 $filename | sed 's/00001148/00001147/g'
tail
命令选择文件的最后一行(tail),此处指定使用1行usint
-1
选项

如果不是最后一行

   grep "00001148" $filename | tail -1 | sed 's/00001148/00001147/g'
grep
命令查找所有发生的事件,并
tail
选择最后一行,然后
sed
进行替换。

使用awk和sed进行替换

sed '1!G;h;$!d' file | awk '/00001148/&&!x{sub("00001148","00001147");x=1}1' | sed '1!G;h;$!d'
但是,所有问题都可以在sed中完成吗

sed -n '1!H;1;h;${x;s/\(.*\|\)00001148\|/&OtherNumberHere\|/;p;}' YourFile
sed试图在搜索模式中获取最大的内容,因此默认情况下,表单开始到最后一个| 00001148 |是可用的最大模式(如果有)

尝试以下操作:

    tac $filename | sed '0,/00001148/{s/00001148/00001147/}' | tac
tac反转您的文件。
sed命令将替换第一次发生。

然后再次使用tac反转结果。

是文件中匹配的最后一行吗?是的,我的命令正在匹配,并在第一行和最后一行中替换为00001147。但我只想在最后一行中进行更改。请注意,
cat
的使用完全是uooc-对
cat
的无用使用
sed
完全能够读取文件。是否可以保证要替换的行是最后一行,或者在重复编号之前和之后是否有许多其他行需要修复?数据文件有多大?在没有
tac
(你不能简单地安装它吗?)的情况下,有几种方法可以反转一个文件,该文件可以处理适合内存的较小文件,而其他文件可以处理不适合内存的较大文件。这两个命令将只得到一行替换的字符串00001147,但我需要文件中剩余的数据和替换的字符串。那么,我是否需要用上述命令的输出替换最后一行?我尝试了sed'$s/00001148/00001147/g'$filename,但没有替换最后出现的字符串。但我改变了一些类似的东西,sed“5,$s/00001147/00001146/g”$filename。它正在第五行搜索模式并替换。您的输入不清楚<代码>$如果在最后一行出现,则替换。如果没有,它什么也做不了。从
5开始,$
它将替换第5行和最后一行之间的所有事件,如果它替换了您的第5行,则它仅出现在第5行