2012-12-12 19 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

有趣的是,我不知道+符号在正则表达式中有什么用处。感谢分享! –

相关问题