0

我需要用单引号替换文本,sed但我无法让它工作。这是我的代码;你能帮助我吗?

我有一个这种格式的文本文件:

#sometext
$configuration_TEstbk2_bk2_environment12 = 'lalala'
$configuration_TEstbk2_bk2_envoronment12 = 'lalala1'
$configuration_TEstbk2_bk2_staging12 = 'BACKUP 2'
$configuration_waq4faw4f_q4fq4qg4f = 'r234rq43rq4rqr'
$configuration_alice_StagingTEstBk_bk = 'testebk'
$configuration_deployment_overlays_alice_TEStStngDir = 'some'
$configuration_arefgqrqgrq_341q34tq34t = '134t135'

我需要做类似的事情:

sed s/$configuration_arefgqrqgrq_341q34tq34t   ='134t135'/$configuration_arefgqrqgrq_341q34tq34t = 'NEWVALUE'/g 

我尝试了很多组合,sed但我找不到一个有效的组合。

4

5 回答 5

1

这对你有用吗?

sed "/\$config_deployment_overlays_alice_arefgqrqgrq_341q34tq34t_staging/s/'134t135'/'NEWVALUE'/" file
于 2013-04-12T20:30:28.103 回答
0

这可能对您有用(GNU sed):

sed -r 's/^(\$\S+\s=\s'\'').*('\'')/\1NEWVALUE\2/' file
于 2013-04-13T07:39:22.857 回答
0

您还可以通过捕获它们来完全避免匹配的引号:

sed '/$configuration_arefgqrqgrq_341q34tq34t/{
         s/\(= *.\).*\(.\) *$/\1NEWVALUE\2/
}' input
于 2013-04-12T21:06:03.070 回答
0

我可能会使用:

sed '/$configuration_arefgqrqgrq_341q34tq34t *=/'"s/'134t135'/'NEWVALUE'/"

这在 shell 级别混合使用单引号和双引号来获取正确的信息到sed. 单引号将搜索条件括起来,其中包含$configuration_arefgqrqgrq_341q34tq34t后跟一些空格和等号的行。这避免了 shell 扩展可能是 shell 变量名的内容(但可能不是,因此将替换空字符串)。然后,我在 shell 级别切换到双引号,以便sed看到单引号:它将单引号中的值替换为替换值,但仅在那些包含给定配置参数名称的行上。

我希望用户永远不必键入那些配置参数名称。

于 2013-04-12T20:41:21.873 回答
0

我想你的问题是引用。您可以使用复杂的引用来确保所有内容都在单引号中,除了需要在双引号中的单引号:

sed 's/$configuration_arefgqrqgrq_341q34tq34t *= *'"'134t135'"'/$configuration_arefgqrqgrq_341q34tq34t = '"'NEWVALUE'/g"

...或者您可以使用一些临时变量来使整个内容更具可读性,并且适合包含在一对双引号中:

directive='$configuration_arefgqrqgrq_341q34tq34t'
oldvalue="'134t135'"
newvalue="'NEWVALUE'"
sed "s/$directive *= *$oldvalue/$directive = $newvalue/g"

(如果您只期望一场比赛,那么/g标志是多余的。)

于 2013-04-12T20:42:23.647 回答