2016-08-01 367 views
-4

嘗試提取括號(AA)之間的數字並修改(例如乘以300),並使用新值更新舊值(AA) (AA * 300)全文。正則表達式從圓括號中提取數字,修改,然後替換原始數字

例輸入:

RRRR TTTTYYY (22); 
UUUUUUU IIIIII4 (55); 

預期輸出:

RRRR TTTTYYY (6600); 
UUUUUUU IIIIII4 (16500); 
+1

請顯示您所做的任何嘗試。 – James

+0

你只希望有一個單一的括號? (例如沒有嵌套圓括號) –

+0

你可以編輯和詳細說明你的問題嗎?我根本不明白你在問什麼。你正在使用縮寫詞,這看起來好像你沒有在這方面投入太多精力。 – TankorSmash

回答

0

gawk來救援!

$ awk '{print $1,$2,"("300*gensub(/\((.*)\);/,"\\1",1,$3)");"}' file 

RRRR TTTTYYY (6600); 
UUUUUUU IIIIII4 (16500); 

條件括號

$ awk '{v=gensub(/\((.*)\);/,"\\1",1,$NF); if(int(v)==v) $NF="("(300*v)");"}1' file 

RRRR TTTTYYY (6600); 
UUUUUUU IIIIII4 (16500); 
ZZZ FFF (2,3); 

,我添加了最後一行輸入文件基礎上的價值。

也許這是對整數限制比賽只

$ awk '{if(match($NF,/\([0-9]+\)/)) 
      $NF="(" 300*substr($NF,RSTART+1,RLENGTH-2) ");"}1' file 

RRRR TTTTYYY (6600); 
UUUUUUU IIIIII4 (16500); 
ZZZ FFF (2,3); 
+0

工作正常。 是否有任何通用的解決方案: 測試括號(AA)之間的數字是否是一個整數,則* 300,在文本中的任何位置, 避免(2,3)類型的數字。 –

+0

整數測試,你可以做'int(x)== x' – karakfa

0
在Perl

,程序上更好的解決方案:

my $str = 'RRRR TTTTYYY (22)'; 
my $num = $1 if $str =~ /\((\d+)\)/; 
my $result = $num * 300; 
$str =~ s/$num/$res/; 
print $str; 

功能:

sub x { 
    my $str = @_; 
    my $num = $1 if $str =~ /\((\d+)\)/; 
    my $result = $num * 300; 
    $str =~ s/$num/$res/; 
    return $str; 
} 

print x('RRRR TTTTYYY (22)'); 

爲一個班輪哪裏file.txt每行包含一個字符串

perl -lne '$num = $1 if $_ =~ /\((\d+)\)/; $res = $num * 300; $_ =~ s/$num/$res/; print' file.txt 
+0

請檢查下面的圖片,你可以得到一個想法 謝謝你的幫助 https://s32.postimg.org/lena34479/image.png –

+0

我的第三個例子應該做到這一點。粘貼到您的命令行並將'file.txt'更改爲您的文件的路徑。如果你在窗口中,你可能需要將''''改成'''' – beasy

+0

請注意,正則表達式'/ \((\ d +)\)/'只能捕獲一個int。任何不是0 - 9的字符',')會導致匹配失敗,並且不會進行替換 – beasy

0

如果你的字符串中唯一的數字是,括號內的的,那麼這是非常簡單的用Perl:

$ perl -pE 's/(\d+?)/300*$1/eg' your_input_file.txt 
RRR TTTTYYY (6600); 
UUUUUUU IIIIII1200 (16500); 

如果您需要檢查括號,然後就有點困難

$ perl -pE 's/(?<=\()(\d+?)(?=\))/300*$1/eg' your_input_file.txt 
RRR TTTTYYY (6600); 
UUUUUUU IIIIII4 (16500); 
相關問題