2012-12-12 22 views
0

我的情況是這樣的 - 我有一個文件:我使用正則表達式有什麼問題?

this line(5) 
that line(6) 
another line(9) 
one more(88) 
last line(156) 

我需要在括號將值更改爲:

this line(1) 
that line(2) 
another line(3) 
one more(4) 
last line(5) 

基本上,使值從1

下令開始

現在,這裏是我的代碼:

#!/bin/bash 

FILE=$1 
COUNT=0 
echo "Working with $FILE" 

if [ -f $FILE ]; then 
while read -r line; do 
    echo ${line/\([0-9]{1,3}\)/\($COUNT\)}; 
    let COUNT++; 
    done < $FILE 
else 
    echo "File does not exist!" 
fi 

這是我得到:

this line(5))/(0)} 
that line(6))/(1)} 
another line(9))/(2)} 
one more(88))/(3)} 
last line(156))/(4)} 

我在做什麼錯?我怎樣才能在正則表達式中指定多個任意長度?

非常感謝。

+0

感謝您的幫助,我結束了使用最爲相似的德雷克的編輯響應的解決方案,儘管謝謝大家的幫助! –

回答

1

你的回聲線改成這樣:

echo ${line%%\([0-9]*\)}\($COUNT\) 

編輯:的模式替換版本作品以及,假設有沒有在符合其他地方的數字括號 - 使用模式替換和確保它僅着眼於線的末端,使用%焦炭第一/分離後,像這樣:

echo ${line/%\([0-9]*\)/\($COUNT\)} 
0

下面是一個使用cat -n打印與行的行號,並sed來代替行號到括號的另一種方法:

cat -n $FILE | sed 's/^ *\([0-9]*\)\t\(.*\)([0-9]*)/\2(\1)/' 

我能得到您的解決方案,通過改變工作正則表達式線以下:

echo ${line/([0-9]*)/($COUNT)}; 

我不能得到重複範圍內工作,雖然那裏。

1

echo ${line/([0-9]*)/($COUNT)};

您的原版有{}(由於某種原因不支持),並且}以變量結束。 ()也不支持(至少在這裏)這一事實意味着我們不必逃避它們。

1

請注意,${line/([0-9]*)/($COUNT)}不是很正確:[0-9]*表示一個數字後跟零個或多個任意個字符 - 不限於數字。例如

line='foo(1abc)' 
COUNT=2 
echo ${line/([0-9]*)/($COUNT)} 

輸出foo(2)

的正則表達式[0-9]+等效bash pattern是擴展模式+([0-9])

shopt -s extglob 
echo ${line/(+([0-9]))/($COUNT)} 
+0

有趣的是,我不知道+符號在正則表達式中有什麼用處。感謝分享! –

相關問題