2014-10-08 38 views
0

我试图用sed在文件中搜索最后一次出现。在HP-UX tac选项中不可用。KSH:sed命令来搜索并替换文件中最后一次出现的字符串

对于防爆:下面是文件中的数据,

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改为00001147为00001148.

都发生

我必须搜索最后一次出现的|00001148|并用另一个数字替换。目前我的sed命令改变00001148.

+0

匹配行是否在文件最后一行? – nu11p01n73R 2014-10-08 04:41:19

+0

是的,我的命令在第一行和最后一行都是匹配的,并用00001147替换。但我只想在最后的匹配行中进行更改。 – Srinivas 2014-10-08 04:46:21

+0

请注意,使用'cat'完全是UUOC - 无用的使用'cat'。 'sed'完全可以读取文件。 – 2014-10-08 05:41:48

回答

4

编辑两个两个实例

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

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命令查找所有occureences和tail选择的最后一行和sed使得更换。

+0

这两个命令都只能得到1行,被替换的字符串为00001147,但我需要用替换的字符串保留文件中的剩余数据。那么我是否需要用上述命令的行输出替换最后一行? – Srinivas 2014-10-08 05:03:04

+0

我试过sed'$ s/00001148/00001147/g'$ filename,但是没有替换最后一次出现的字符串。 但我改变了这样的东西, sed“5,$ s/00001147/00001146/g”$ filename。它正在寻找模式并在第5行进行替换。 – Srinivas 2014-10-08 05:52:38

+0

您的输入不清楚。如果在最后一行有“发生”,则使用'$'替代。如果没有,它什么都不做。 从'5,$'开始,它会重置第5行和最后一行之间的所有事件,如果它替换了第5行,那么它只发生在第5行 – nu11p01n73R 2014-10-08 06:05:05

0

方式使用awk和sed

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

可以probs都可以在sed虽然

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

的sed正在试图获得在搜索模式最大的内容做了,所以默认形式开局最后| 00001148 |是可用的最大模式(如果有)

相关问题