2015-07-10 89 views
0

我有這樣..有人可以幫我一個模式來弄明白SED命令刪除最後一個數字的單詞,並用序列代替

abc1 17898 8779 
abc1 68579 7879 
abc2 78794 8989 
abc2 97857 9897 
abc3 79850 9905 
. 
. 
. 
abc120 84889 9897 
abc121 87898 7879 
abc121 87898 7879 
abc121 87898 7879 
abc122 87898 7879 
abc122 87898 7879 

我想刪除旁邊ABC的數字,給它們適當的序列,

這應該是這樣的

abc1 17898 8779 
abc2 68579 7879 
abc3 78794 8989 
abc4 97857 9897 
abc5 79850 9905 
.. 
. 
. 
abc120 84889 9897 
abc121 87898 7879 
abc122 87898 7879 
abc123 87898 7879 
abc124 87898 7879 
abc125 87898 7879 
+0

SED的/ ABC [0-9]/ABC * [0+]/G'in.txt> out.txt 其中我認爲[0-9]是abc旁邊的位數,* [0+]可以是一個增量來替換之前的數字 – SKG

+2

發佈樣本輸入/輸出時,請勿使用'... '代表延續,因爲它使得這個例子不可測試。我們想要一些具體的測試用例,我們可以測試一個潛在的解決方案,而不是我們可以用來創建自己的測試用例的想法/建議。 sed用於簡單替換個別行,順便說一句,這就是全部。如果你需要做其他事情,包括數學,那麼就使用awk。 –

回答

0

考慮使用perl,它支持基本的算術運算(相對於sed)。例如:

perl -pe 's/\B\d*\b/$./' filename 

這裏\b相匹配的字邊界和\B一個空字符串,它是不是一個字邊界一致,所以\B\d*\b在第一個字中的端部的組號(或空字符串)的匹配行,並且$.是當前行號 - Perl已經幫助我們記錄了它。

另外,

perl -pe 's/^abc\d*/abc$./' filename 

是更符合您的一次嘗試。

如果在輸入線不匹配abc模式和計數器不應該爲他們增加,

perl -pe 's/^abc\d*/"abc" . ++$n/e' filename 

讓你做你自己計數。

+0

會試試。謝謝你 – SKG

+0

它的工作原理。謝謝 – SKG

+0

需要幫助..我想要從abc開始,每行顯示一段話。 #!/ usr/bin/env perl 使用警告; open(tran_file,「in.txt」); open(OUT,「> out.txt」); $ count = 0; while($ line = ) { chomp($ line); if($ line =〜m/^ abc \ d * /)###匹配單詞abc。 if($ line =〜/\s(\d*)\s+\s(\d+\.\d+)\s+\s(\d+\.\d+)\s(.+)/) \t ###試圖劃分行中的內容並提取所有行中的第一個詞,即。,ABC1 \t \t \t \t { 打印OUT 「$ 1 \ n」 個; } } } close(tran_file); – SKG

1

這與awksed容易得多:

awk -F 'abc' '{sub(/^[0-9]+/, "", $2); print FS NR $2}' file 
abc1 17898 8779 
abc2 68579 7879 
abc3 78794 8989 
abc4 97857 9897 
abc5 79850 9905 
... 
... 
1
$ awk '{sub(/[0-9]+/,NR)}1' file 
abc1 17898 8779 
abc2 68579 7879 
abc3 78794 8989 
abc4 97857 9897 
abc5 79850 9905