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

时间:2014-10-08 04:31:28

标签: sed ksh hp-ux

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

对于Ex:以下是文件中的数据,

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实例。

4 个答案:

答案 0 :(得分:5)

<强> 修改

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

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命令从文件中选择最后(尾部)行,此处指定采用1行usint -1选项

如果不是最后一行,

   grep "00001148" $filename | tail -1 | sed 's/00001148/00001147/g'

grep命令查找所有发生的事件,tail选择最后一行,sed进行替换。

答案 1 :(得分:0)

用awk和sed的方式

sed '1!G;h;$!d' file | awk '/00001148/&&!x{sub("00001148","00001147");x=1}1' | sed '1!G;h;$!d'

虽然

可以在sed中完成所有操作

答案 2 :(得分:0)

sed -n '1!H;1;h;${x;s/\(.*\|\)00001148\|/&OtherNumberHere\|/;p;}' YourFile

sed正在尝试获取搜索模式中最大的内容,因此默认情况下表单开始到最后一个| 00001148 |是可用的最大模式(如果有的话)

答案 3 :(得分:0)

尝试一下:

    tac $filename | sed '0,/00001148/{s/00001148/00001147/}' | tac

tac反转文件。
sed命令替换了第一次出现的情况。
然后再次使用tac反转结果。