我尝试使用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实例。
答案 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反转结果。