Bash:替换中的正则表达式

Bash:替换中的正则表达式

我有一个 Bash 脚本,用于替换文本模式中的数字值。假设我有一个这样的文件:

word5word
word55word

我希望它看起来像这样:

word125word
word125word

我有这个脚本来执行此操作:

#!/bin/bash

re='([0-9]|[0-9][0-9])'
while read line
  do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
  done < /home/tomak/test.txt

由于某种原因,'re' 表达式无法正确解释,它会打印原始行。我就是搞不懂为什么。它适用于单个数字,即re='[0-9]'

为了形成这个表达式,我使用了Bash 初学者指南其中指出:

两个正则表达式可以通过中缀运算符“|”连接起来;生成的正则表达式将匹配与任一子表达式匹配的任何字符串。

但它对我来说不起作用。我错过了什么?

请注意,我尝试设置shopt -s extglob和制定类似的表达式[0-9][0-9]?,但这也不起作用。

我在 Ubuntu 14.10 上,有 stock bash 版本 4.3.30。我使用 运行脚本bash foo.sh

答案1

参数扩展的替换不适用于正则表达式。extglob可以在这里为您提供帮助,但它也不适用于正则表达式。

下表达式的正确语法extglob

re='+([0-9])'

即一个数字一次或多次。

测试:

re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
done

输出:

word125word
word125word

答案2

如果您只是用模式替换,我建议使用 sed 或 perl 而不是 bash:

sed -e 's/word[0-9]\+word/word125word/g' /home/tomak/test.txt

或者

perl -pe 's/word\d+word/word125waord/g' /home/tomak/test.txt

相关内容