2014-10-08 116 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 |是可用的最大模式(如果有)

相關問題