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

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

非常感激。

4

4 回答 4

1

将您的回声线更改为:

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

编辑:模式替换版本也适用,假设在该行的其他任何地方都没有带数字的括号 - 要使用模式替换并确保它只查看行尾,请在第一个分隔符%后使用 char /,像这样:

echo ${line/%\([0-9]*\)/\($COUNT\)}
于 2012-12-12T20:16:22.310 回答
1

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

你原来的有{}(由于某种原因不支持),并且}结束了变量。's 也不受支持(至少在这里)这一事实()意味着我们也不必逃避它们。

于 2012-12-12T20:16:54.037 回答
1

请注意,这${line/([0-9]*)/($COUNT)}并不完全正确:该模式[0-9]*表示一个数字后跟零个或多个任意字符 - 不限于数字。例子

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

输出foo(2)

正则表达式的等效bash 模式[0-9]+是扩展模式+([0-9])

shopt -s extglob
echo ${line/(+([0-9]))/($COUNT)}
于 2012-12-12T23:56:12.510 回答
0

这是另一种方法,用于使用cat -n行打印行号,并将sed行号替换为括号:

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

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

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

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

于 2012-12-12T20:07:24.163 回答