2016-02-25 29 views
0

我希望能够更改配置文件中的特定设置,其中包括删除注释掉这些设置的注释代码(;)。此外,我想保留真实的评论。这意味着,更改配置文件和复杂注释操作

some_setting=0 

;some_setting=0 

既能成为

some_setting=9 

但是,这也意味着,

some_setting=0 ;an honest-to-goodness comment 

;some_setting=0 ;an honest-to-goodness comment 

some_setting=9 ;an honest-to-goodness comment 

我还不想离开

;Idle talk about some_setting= 

孤单。

我似乎能够与

sed -e 's/^\s*;\?\s*some_setting\s*=.*\(;\)\?/some_setting=9 \1/' 

实现几乎所有的这一点,但问题是真正的意见得到剥离出来有some_setting线。请注意,我已经在许多这些令牌周围留出了空格。

我已经看过使用awk这个,但它似乎最好的选择是sed

我在Debian 8.3上为此使用了GNU sed 4.2.2。

+0

这是正确的:如果一行以'some_setting ='或'; some_setting ='开始,它应该被修改为以'some_setting = 9'开头,其他所有内容都不应该被触摸? –

+0

“其他所有”意味着其他行应该保持不变,是的。 – Opux

回答

1

我以此为测试输入:

some_setting=0 
;some_setting=0 
some_setting=0 ;an honest-to-goodness comment 
;some_setting=0 ;an honest-to-goodness comment 
;Idle talk about some_setting= 

使用该命令:所以开始与可选;一行接着some_setting=

$ sed -r 's/^;?(some_setting=)[^[:space:]]*(.*)/\19\2/' infile 
some_setting=9 
some_setting=9 
some_setting=9 ;an honest-to-goodness comment 
some_setting=9 ;an honest-to-goodness comment 
;Idle talk about some_setting= 

和任何非空格字符来它是后换成以some_setting=9开头的行;该行的其余部分保持不变。

+0

这很不错。什么是':空间:'?我以前从来没有见过。我不想假定这个设置的数据没有空格,但现在我想到了,我也没有考虑过分号会成为设置的一部分的可能性。例如'some_setting ='设置w/a;在其中';然后是评论。' – Opux

+0

@Opux'[:space:]'是一个“POSIX字符类”。与'\ s'相同,但更便于携带。 如果可以引用设置并包含分号,这仍然可能,但会变得更加麻烦。这样的设置是否存在?如果是的话,你可以更新问题,如果你想。 –