用正则表达式替换花括号中的数字

时间:2014-12-03 04:53:07

标签: regex bash perl sed

我正在尝试编写一个脚本来自动生成具有不同参数的多个输出文件的过程。这需要在以下代码语句中的CONFIG.c_mm2s_burst_size和CONFIG.c_s2mm_burst_size之后替换花括号中的数字。

  set_property -dict [ list CONFIG.c_include_mm2s {1} CONFIG.c_include_mm2s_dre {0} CONFIG.c_include_s2mm_dre {0} CONFIG.c_include_sg {0} CONFIG.c_m_axi_mm2s_data_width {32} CONFIG.c_m_axis_mm2s_tdata_width {32} CONFIG.c_micro_dma {0} CONFIG.c_mm2s_burst_size {2} CONFIG.c_s2mm_burst_size {2} CONFIG.c_sg_length_width {23}  ] $axi_dma_0

代码在tcl中。我尝试了变量替换,但它没有正确解释类似的东西 CONFIG.c_mm2s_burst_size {$var}

所以我认为用sed和perl替换文本中的数字应该不难。但是,我已经搜索并整晚都没有成功。

我试过了:

sed -r 's/burst_size\>\s\{(\d+)\}/256/g'

sed -r 's/burst_size\s\{(\.+)\}/256/g'

sed -r 's/burst_size#\{(\d+)\}/256/g'

sed -r 's/burst_size\s\\{(\d+)\\}/256/g'

还有更多,它们都不起作用。我正在使用Ubuntu和GNU 4.2.2。只要我系统地更改数字,欢迎使用其他语言的其他一种班轮。

非常感谢

3 个答案:

答案 0 :(得分:1)

您可以简单地使用以下Perl单线。

perl -pe 's/burst_size\s+{\K\d+/256/g'

答案 1 :(得分:1)

要替换前面带有字符串{}的{​​{1}}括号内的部分数字,可以使用下面的sed命令。 sed不支持burst_size\s。您可以使用\d

代替\s而不是[[:space:]]而不是\d使用POSIX表示法[0-9]
sed 's/\(burst_size \+{\)[0-9]\+}/\1256}/g'
sed -r 's/(burst_size +\{)[0-9]+\}/\1256}/g'

示例:

$ echo 'CONFIG.c_mm2s_burst_size {2} CONFIG.c_s2mm_burst_size {2} CONFIG.c_sg_length_width {23}  ] $axi_dma_0' | sed 's/\(burst_size \+{\)[0-9]\+}/\1256}/g'
CONFIG.c_mm2s_burst_size {256} CONFIG.c_s2mm_burst_size {256} CONFIG.c_sg_length_width {23}  ] $axi_dma_0
$ echo 'CONFIG.c_mm2s_burst_size {2} CONFIG.c_s2mm_burst_size {2} CONFIG.c_sg_length_width {23}  ] $axi_dma_0' | sed -r 's/(burst_size +\{)[0-9]+\}/\1256}/g'
CONFIG.c_mm2s_burst_size {256} CONFIG.c_s2mm_burst_size {256} CONFIG.c_sg_length_width {23}  ] $axi_dma_0

答案 2 :(得分:1)

\s\d,未被sed识别

您可以使用

sed -r 's/(burst_size )\{[0-9]+\}/\1{256}/g' input

sed -r 's/(burst_size[[:space:]])\{[[:digit:]]+\}/\1{256}/g' input