我有一个 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