【问题标题】:shell sed - substitute an unknown string between a known string and a generic delimitershell sed - 在已知字符串和通用分隔符之间替换未知字符串
【发布时间】:2014-03-30 03:15:04
【问题描述】:

好的,我知道我已经提到过类似的帖子,但不符合我遇到的确切问题。

供参考:replace a unknown string between two known strings with sed

我有一个包含 software=setting:value,setting2:value,setting3:value 等的文件...

我的第一次尝试是将上述参考与 sed -i "/software/ s/setting:.*,/setting:,/" $fileName

但是,通配符引用该行的最后一个逗号,而不是紧跟匹配项的逗号。

我目前的工作是: sed -i "/software/ s/setting:[^,]*,/setting:,/" $fileName 但这限制了具有包含逗号包裹在引号内的潜在值的能力,等等......我知道这是一个不太可能的情况,但我想要一个理想的解决方案,其中值可以包含它想要的任何字符,并且只是在“设置:”和值后面的逗号之间进行字符串替换那个特定的设置。

感谢任何帮助。提前致谢!

【问题讨论】:

  • 所以你想匹配所有内容,直到第一个逗号不在带引号的字符串中?引号可以出现在哪里?报价在哪里开始和结束?只是在值的开头和结尾还是在中间?可以多次开始和结束吗?

标签: regex bash shell sed


【解决方案1】:

这将适用于值中的一个或没有引用的部分(引用部分之前和之后的未引用部分):

sed -i '/software/ s/setting:[^,"]*("[^"]*")?[^,"]*,/setting:,/' $fileName

【讨论】:

    【解决方案2】:
    echo 'software=setting:"value1,value2",setting2:value,setting3:value'|sed -E '/software/ s/setting:("[^"]*"|[^,"]*),/setting:,/'
    

    这是 OSX 上的 sed,gnu sed 的选项略有不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2013-05-03
      • 2020-12-29
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多