如何用bash中的另一个字符串替换可变长度的重复字符串?

时间:2020-05-05 08:11:56

标签: regex bash replace

我有一些文件,其中缺少的数据以'+'插入。所以行看起来像这样:

substring1+++++substring2++++++++++++++substring3+substring4

我想用'MISSING'代替所有'+'> 5的重复。这使我的团队更易读,并且更容易查看丢失的数据与输入为“ +”的数据之间的差异(最多允许5个)。 到目前为止,我有:

while read l; do
  echo "${l//['([+])\1{5}']/'MISSING'}"
done < /path/file.txt

,但这将每个“ +”替换为“ MISSING”。我只需要说一次“ MISSING”即可。

谢谢。

1 个答案:

答案 0 :(得分:4)

您不能在Bash变量扩展中使用正则表达式。

您可以在循环中使用

sed 's/+\{1,\}/MISSING/g' <<< "$l"

或者,您可以直接在文件上使用sed

sed 's/+\{1,\}/MISSING/g' /path/file.txt

+\{1,\} POSIX BRE模式与文字++)匹配1次或多次(\{1,\})。

请参见sed demo online

sed 's/+\{1,\}/MISSING/g' <<< "substring1+++++substring2++++++++++++++substring3+substring4"
# => substring1MISSINGsubstring2MISSINGsubstring3MISSINGsubstring4

如果您需要对同一文件进行更改,请使用sed edit file in place中所述的任何技术。