使用sed替换其他两个数字之间的数字

时间:2018-10-02 23:21:55

标签: sed

我需要替换一个数值,该数值出现在一系列配置文件的特定行中,其格式如下:

字符串number_1 number_to_replace数字_2

我想获得这样的东西:

字符串number_1 number_replaced number_2

我遇到的困难是:

  • number_1或number_2可以等于number_to_replace,因此无法简单替换。
  • number_1和number_2在配置文件之间有所不同,所以我事先不知道它们。

到目前为止,我最接近的尝试是:

echo "field 4 4 4" | sed 's/\s4\s/3/'

哪些产出:

field34 4

这很接近,因为我要替换中间数字,所以我添加了另一个“ \ s”以尝试使用行以字符开头的已知事实。

echo "field 4 4 4" | sed 's/\s\s4\s/3/'

哪个给:

field 4 4 4

因此,这次没有任何替换。我该如何进行?进行一些详细的解释将是理想的,因为我的知识是替换包含几乎为零的模式的表达式。 谢谢。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作,与示例中的数字完全匹配。您可以将3替换为您选择的任意数字。

sed 's/\([0-9]\{1,\}\)[[:space:]]\([0-9]\{1,\}\)[[:space:]]\([0-9]\{1,\}\)/\1 3 \3/'

请注意,我已经使用POSIX括号表达式来匹配您正在使用的sed的任何变体中都应支持的空格字符。请注意,\s仅在GNU变体中受支持。

正则表达式定义的字面意思是匹配一个数字,后跟一个空格,然后是一个数字,一个空格和另一个数字。捕获的组从\1存储。由于您打算删除2 nd 位,因此将其替换为您选择的单词。

如果多余的转义符导致其无法读取,请使用-E标志以获得扩展的正则表达式支持。我使用了默认的BRE version