我使用正则表达式有什么问题?

时间:2012-12-12 19:56:37

标签: regex bash

我的情况是这样的 - 我有一个文件:

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)}

我做错了什么?如何在正则表达式中指定一些artbitrary长度?

非常感谢。

4 个答案:

答案 0 :(得分:1)

将您的回声线更改为:

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

编辑:模式替换版本也可以正常工作,假设行中没有其他任何位数的括号 - 使用模式替换并确保它只查看结尾该行,在第一个%分隔符之后使用/字符,如下所示:

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

答案 1 :(得分:1)

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

您的原始文件有{}(由于某种原因不支持),}结束了该变量。事实上()也不受支持(至少在这里)意味着我们也不必逃避它们。

答案 2 :(得分: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)}

答案 3 :(得分:0)

以下是使用cat -n打印行号的替代方法,并使用sed将行号替换为括号:

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

通过将正则表达式行更改为以下内容,我能够使您的解决方案正常工作:

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

我无法让重复范围在那里工作。