我的情况是这样的 - 我有一个文件:
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长度?
非常感谢。
答案 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)};
我无法让重复范围在那里工作。